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...


Anmelden zum Antworten