IF und AND



  • hallo,

    ich frage mich, wie IF in C arbeitet. mal angenommen ich habe eine struktur die eine variable i trägt...

    if (ch && (ch->i==24)) printf("ok\n");
    

    Falls ch definiert ist (also ungleich NULL), kein Problem. Aber was passiert, falls ch undefiniert ist?
    gibts einen unschönen programmabbruch, da ch->i ins nirvana zeigt oder checkt C zuerst ob ch existiert und bricht im negativem fall ab, da der ausdruck ja dann schon ohnehin nicht mehr wahr werden kann. also ist der code im endeffekt mit dem äquivalent:

    if (ch) if (ch->i==24)) printf("ok\n");
    

    vielen dank!!!

    gruß, marco



  • ich glaub das gibt nen Absturz. also nehm lieber 2. aber probiers doch ruhig und poste dein Ergebnis.. 🙄



  • Die beiden grundlegenden logischen Vernüpfungen (&& und ||) arbeiten in C und C++ nach dem "Kurzschlußverfahren".

    Dieses begründet auf der booleschen Algebra, die besagt: Wenn eine Teilbedingung einer UND-Verknüpfung (z.B. "a UND b") unwahr ist, ist die gesamte Bedingung unwahr. Wenn ein Teil einer "normalen" ODER-Verknüpfung (z.B. "a ODER b") wahr ist, ist die gesamte Bedingung wahr.

    So kann der Compiler die Verarbeitungszeit optimieren, indem er in bestimmten Fällen keine weitere Prüfung mehr durchführt.

    Stellen wir uns vor, wir hätten einen Zeiger "abc" auf eine Struktur. Dieser Zeiger wird mittels einer Funktion initialisiert, und enthält entweder einen gültigen Wert (Initialisierung erfolgreich) oder NULL (Initialisierung erfolglos).

    Dann stellen wir uns weiterhin vor, ich hätte folgende if-Abfrage:

    if(abc && abc->wert1 > 15 && abc->wert2 < 5)
    

    Wenn nun diese Abfrage erreicht wird, überprüft die Bedingung als erstes, ob abc "wahr" ist. Da ich hier den Zeiger verwende, ist das nur der Fall, wenn im Zeiger etwas anderes als NULL (genauer: 0) steht. War die Initialisierung also erfolglos, ist diese Bedingung unwahr und die anderen Abfragen werden gar nicht vorgenommen, der bedingte Code dahinter wird übersprungen.

    Andererseit kann ich, wenn die Initialisierung erfolgreicht war, und dadurch die Bedingung "abc" wahr ist, ohne Probleme die beiden anderen Überprüfungen durchführen.



  • wieder was gelernt^^



  • Sid2K6 hat die Antwort schon korrekt ausgeführt.

    Dies ein außerdem ein übliches Verfahren, um Pointer korrekt auf Null zu überprüfen, bevor auf deren Inhalte zugegriffen wird.

    Folgende Anweisungen werden vom Compiler in völlig identischen Code übersetzt:

    if (ch && (ch->i==24)) printf("ok\n");
    

    und

    if (ch) if (ch->i==24)) printf("ok\n");
    

    Die Reihenfolge der Bedingungen innerhalb einer if/while/for/do-Abfrage wird vom Compiler in der vorgegebenen Reihenfolge abgearbeitet. Das gilt auch für die unterschiedlichsten Optimierungs-Level.



  • alles klar und vielen dank!



  • ESS_CB schrieb:

    ich glaub das gibt nen Absturz. also nehm lieber 2. aber probiers doch ruhig und poste dein Ergebnis.. 🙄

    So ganz verstehe ich deinen Smiley nicht. Natürlich hast du recht, dass er es hätte testen können, was ihm aber immer noch nicht gesagt hätte, ob das jetzt nur Zufall war, dass es funktioniert. Ganz dreist finde ich aber den rolleyes Smiley, wenn man dazu noch ne falsche Antwort gibt ...


Anmelden zum Antworten