interessante if erkenntnis

D

djtraumwelt

Foren As
Code:
int main(int argc, char *argv[]) {
 int x;
 int y;
 x=1;
 y=1;
 if (x==y)
  if (x==1) {
   x=2;
   y=3;
   printf("Hello World!");
  }
 return 0;
}

Wenn man ein if ohne { und } macht, dann muss das, was passiert, wenn die Bedingung erfüllt ist, in eine Zeile passen. In dem obigen Programm stehen aber 5 Zeilen, die ohne Meckern des Compilers oder des Systems alle ausgeführt werden. Habe dieses Programm unter Win getestet und der Hello World String wird tatsächlich ausgegeben. Des weiteren: Wenn man jetzt vor den ifs anstatt y=1 ein y=2 macht und somit dafür sorgt, dass die Bedingung nicht erfüllt ist, dann sollte das Programm doch eigentlich nur eine Zeile überspringen und zwar mitten in die zweite if rein. Es wird aber tatsächlich alles übersprungen und kein Hello World ausgegeben. Und das ganze funktioniert sogar, wenn bei zutreffen der Bedingung eines if ohne { und } ein for kommt.

Hat man also einen Code, der bei zutreffen der Bedingung jediglich eine weitere if oder eine schleife ausführen soll, dann kann man sich die lästigen { und } sparen.
 
Zuletzt bearbeitet:
Hallo,


was stört dich an den {} ? Ich finde die erhöhen die Lesbarkeit hier deutlich. Ohne C groß zu kennen, hätte ich jetzt ohne die von dir getätigten Einrückungen vielleicht ein Problem gehabt, dass Programm nachzuvollziehen.
Das sieht ja schon fast wie Python aus :D
Wieso verschachtelst du dass überhaupt. Wäre ein 'and' hier nicht praktischer? Wie gesagt, ich kenne C kaum.

cu
 
Das if bildet mit Bedingung und Anweisungen einen Anweisung, daher wird es ausgeführt.
Die geschweiften Klammern sind übriegens keinesfalls lästig, sie erhöhen zusammen mit einer korrekten Einrückung die lesbar- und damit debugbarkeit deiner Quelltexte, ein gutes Beispiel hast du eben selbst geliefert.

Juhu 42*10 Beiträge
 
Verschachteln tu ich hier, weil ich mit diesem Code dieses if verhalten Testen wollte. Ohne diese Verschachtelung wäre ich nicht zu dieser Erkenntnis gekommen und das ganze Programm hätte keinen Sinn gemacht.

Ich finde weniger geschweifte Klammern kann man besser lesen. Es kommt so oft vor dass ich drei mal } hintereinander machen muss und dann meckert der compiler, weil da noch eine vierte fehlt. Ich finde einen Text, der aus 4 Zeilen besteht, wo in jeder Zeile nur eine } steht, irgendwie gar nicht gut lesbar. Aber das ist wohl jetzt Geschmackssache :D
 
Verschachteln tu ich hier, weil ich mit diesem Code dieses if verhalten Testen wollte. Ohne diese Verschachtelung wäre ich nicht zu dieser Erkenntnis gekommen und das ganze Programm hätte keinen Sinn gemacht.

Ich finde weniger geschweifte Klammern kann man besser lesen. Es kommt so oft vor dass ich drei mal } hintereinander machen muss und dann meckert der compiler, weil da noch eine vierte fehlt. Ich finde einen Text, der aus 4 Zeilen besteht, wo in jeder Zeile nur eine } steht, irgendwie gar nicht gut lesbar. Aber das ist wohl jetzt Geschmackssache :D

In dem Fall, wenn's bei den schließenden Klammern unübersichtlich wird, z.Bsp. setz ich bei den schließenden Klammern einen kurzen //Kommtar, der sagt, wozu die schießende } gehört, z.Bsp:

PHP:
int main(int argc, char *argv[]) {
 int x;
 int y;
 x=1;
 y=1;
 if (x==y){
  if (x==1) {
   x=2;
   y=3;
   printf("Hello World!");
  } //if x1
}//if xy
 return 0;
}//main
Nebenbei ist's doch ausserdem um einiges weniger fehleranfällig, wenn du Schleifen grundsätzlich klammerst, oder nicht? Stell dir mal vor, du willst später, das nach dem zweiten if (aber noch innerhalb des ersten) noch ein (paar) Anweisungen ausgeführt werden... kann mir vorstellen, das du dich (oder der, der deinen Code editiert) zumindest kurz über Fehler ägerst, die du dann erst aufm zweiten Blick erkennst....
 
Zuletzt bearbeitet:
Es gibt für Java ein paar Coding Konventionen, die man super auf C übertragen kann und meiner Meinung nach Sinn machen:
Code:
// Einzeilige ifs ohne Klammern
if (condition) doAnweisung();

// Bei mehrzeiligen dann eben wieder so:
if (condition) {
    Anweisung1;
    Anweisung2;
    ...
    AnweisungN;
}
Die Lesbarkeit wird nicht durch viele Schweifklammern schlechter, sondern durch überlange Methoden. Der beste Weg, da dran vorbeizukommen ist gutes Aufteilen in Methoden und teilweise auch Objektorientierung (weil sehr eleganter Weg um unterschiedliches Verhalten durch Polymorphie zu lösen, erspart viele ifs und switch-Statements)

Das oben gezeigte Schachteln der schliessenden Klammern ist übrigens auch sehr sinnvoll. Dazu kommt dann noch, dass eine gute IDE (z.B. Eclipse) Mechanismen bietet, um zu sehen, bis wo der Block geht (Markierung der schliessenden Klammer, Doppelklick selektiert alles zwischen den Klammern) Dann lässt sich gut damit arbeiten.
 
Wenn man ein if ohne { und } macht, dann muss das, was passiert, wenn die Bedingung erfüllt ist, in eine Zeile passen.

Nein. In C wird grundsätzlich nur die erste Anweisung nach dem if ausgeführt, falls die Bedingung erfüllt ist. Diese Anweisung muss nicht unbedingt in einer Zeile stehen. Beispiel gefällig:

Code:
int main(){
        int x = 0;

        x++;
        if (x == 1)
        x
        =
        234
        +
        6
        ;

        printf("x = %d", x);

        return 0;
}

Sollen mehrere Anweisungen ausgeführt werden musst du eine Verbundanweisung erstellen. Das machst du indem du um diese Anweisungen die geschweiften Klammern setzt. Der Compiler betrachtet eine Verbundanweisung als eine Anweisung und kann somit auch mehrere Befehle ausführen.

In deinem Beispiel ist die erste Anweisung nach dem ersten if wieder ein if, welches ausgeführt wird, sobald die Bedingung erfüllt ist. Ist auch das zweite if erfüllt, so wird wieder nur die erste Anweisung nach diesem if ausgeführt. In deinem Fall ist das eine Verbundanweisung, wodurch der gesamte Block ausgeführt wird.

Ich hoffe ich habe dir das jetzt etwas verständlicher machen können.
 
Es wurde doch längst gesagt, dass es eben die nächste Anweisung und nicht Zeile ist....
 

Ähnliche Themen

Xubuntu - AVR32-linux crosscompile sqlite

Ausgabe in *.txt Datei & Struct

SDL applikation frisst speicher ohne ende

Bitte zeigt mir meinen Fehler!!!

Ubuntu X / dbus problem

Zurück
Oben