Was macht das Programm? (Bitte um schnelle Antwort)
-
#include <stdio.h> int main (void) { unsigned char *i, j[2]; i=j+1; *i=1; while (((i!=j) && !((--(*i)) || !(--i) || (*i=255))) || ((*i==0) || ((*i && (printf("%c -> %d\n", *i, (int)(*i)--)))))); return 1; }
Die Frage ist jetzt, was dieses Programm macht, und weshalb es das tut.
-
Auf den ersten Blick würde ich sagen, dass er gleich zum return raus springt, da er bei
&& !((--(*i))
die 1, die er zuvor füllte dekrementiert und vergleicht. Kann aber auch falsch sein, es ist 08:12h!!!!! (Schnaaaaarch.....)
-
Das Programm fällt unter das Kapitel warum einfach und kurz wenns auch kompliziert und lang geht
-
HAR schrieb:
Auf den ersten Blick würde ich sagen, dass er gleich zum return raus springt, da er bei
&& !((--(*i))
die 1, die er zuvor füllte dekrementiert und vergleicht. Kann aber auch falsch sein, es ist 08:12h!!!!! (Schnaaaaarch.....)
Jo, du hast recht - es ist falsch.
*i ist 1 und --(*i) ist 0 und !0 ist true
allerdings würde ich sagen, dass --i undefiniertes verhalten erzeugt: da j[0] uninitialisiert ist und somit --i ebenfalls keinen wert hat, da --i == &j[0]
-
Eher unter die Rubrik: "Mein Bildschirm ist breiter als hoch und ich will alles auf einen Blick sehen"
@shade
Wird durch die Angabe von j[2] nicht gleich Speicher reserviert und der Wert von j auf die Adresse dieses Speichers gesetzt?Zur Anfangsfrage:
Ich glaube, du bekommst eine Speicherzugriffsverletzung. Warum? Weil du beim zweiten Schleifendurchlauf versuchst auf die Adresse vor j (also j-1) zu schreiben. Das printf() wird übrigens meiner Meinung nach übergangen. Allerdings glaube ich auch, dass das Verhalten des Programms vom Compiler abhängt, wie er die Prüfungen auswertet.
-
Oh, ich hab nen Fehler gemacht. Denn j[0] wird durch *i=255 auf auf 255 gesetzt.
Naja, habs jetzt verstanden - ganz schön tricky, aber das war ja klar.
es gibt die ASCII Zeichen von 255 bis 0 aus. Man muss lediglich die Klammernsetzung beachten...
btw: @AJ: ich wüsste jetzt noch wo die Reihenfolge der Auswertung eine Rolle spielt
-
@shade
Vergiss was ich geschrieben hab. Hab grad gesehen, dass ich was falsch gelesen hab. Anstatt *i==0 hab ich *i=0 gelesen. Darum mein Gedankengang. Jetzt ist es mir auch klar.
-
Hmm, ich hab C leider nur ein Semester lang gemacht und das ist schon n paar Sems her.
Was passiert denn ganz genau - also wie kommt es dazu, dass er jetzt die ASCII Tabelle ausspuckt, warum ASCII-Wert -> ASCII-Zeichen nicht verschoben ist oder warum i mit j+1 definiert wird!
Nochmals vielen Dank für die Beteiligung
-
Beachte dass es Lazy Evaluation in C gibt.
In deinem Code gibts 2 hauptteile im while, getrennt durch ein ||
dh das erste wird am anfang ausgeführt:(i!=j) && !((--(*i)) || !(--i) || (*i=255)))
welches nix anderes macht als i auf j[0] zeigen lassen und dort den Wert 255 hinzuschreiben.
dadurch wird i!=j false und bei weiteren durchläufen wird der code nicht mehr ausgeführt.
der rest sollte damit klar sein...