Forum: Compiler & IDEs if Abfrage - Verschachteln oder gleichzeitig?


von Joe S. (bubblejoe)


Lesenswert?

Hey Leute,

ich frage mich gerade, ob, und wenn, was für einen Unterschied es macht,
ob man if Abfragen verschachtelt oder gleichzeitig macht.

Beispiel:
1
if(x)
2
{
3
    if(y)
4
    {
5
        ...
6
    }
7
}

oder
1
if(x && y)
2
{
3
    ...
4
}

Ist das eine besser als das andere?

Grüße Joe

von Cyblord -. (cyblord)


Lesenswert?

Es ist viel übersichtlicher wenn du direkt den gesamten Boolschen 
Ausdruck in eine Bedingung schreibst. Dann sieht man auf den ersten 
Blick was das IF tun soll. Aber es gibt natürlich Fälle in denen machen 
verschachtele IFs sinn, aber sicher nicht in deinem einfachen Beispiel.

Nicht ganz deine Frage, aber ähnlich:
Ein berühmtes C-Mantra sagt "Code links halten. Wächter- statt 
Schachtel-IF".

gruß
cyblord

von Thomas K. (tkroth) Benutzerseite


Lesenswert?

Hängt von deiner Situation ab. Beispiel: Du hast einen Alarmsensor und 
musst auch überprüfen ob der 'Scharf'-Schalter aktiv ist. Wurde kein 
Alarm ausgelöst, ist die Stellung des Schalters eigentlich egal. Da wäre 
einen Verschachtelung besser:
1
if (Alarm) {
2
     if (Scharf) {
3
       GrossBrumburium und Trataa ;
4
     }
5
   }

Zweites Beispiel: Du musst zwei Alarmsensoren prüfen und beide müssen 
melden, damit der ALarm ausgegeben wir:
1
if (Alarm1 && Alarm2) {
2
     Nato anrufen ;
3
   }

von Cyblord -. (cyblord)


Lesenswert?

Thomas K. schrieb:
> Hängt von deiner Situation ab. Beispiel: Du hast einen Alarmsensor und
> musst auch überprüfen ob der 'Scharf'-Schalter aktiv ist. Wurde kein
> Alarm ausgelöst, ist die Stellung des Schalters eigentlich egal. Da wäre
> einen Verschachtelung besser:
>
>
1
if (Alarm) {
2
>      if (Scharf) {
3
>        GrossBrumburium und Trataa ;
4
>      }
5
>    }

Und warum ist das hier jetzt besser als
1
if (Alarm && Scharf)...

Deine beiden Beispiele sind im Bezug auf die Verschachtelung genau 
gleich zu bewerten.

von Thomas K. (tkroth) Benutzerseite


Lesenswert?

Die gleichzeitige Abfrage kostet mehr Rechenzeit. Evtl. auch dann, wenn 
ein Parameter (vorerst) nicht zwingend überprüft werden muss oder nur 
dann relevant ist, wenn der andere Parameter einen positiven Test 
ergibt.

Wenn du nicht so auf die Anlaufgeschwindigkeit achten muss, kannst 
natürlich auch beides einsetzen. Das Ergebnis wäre das selbe.

von Karl H. (kbuchegg)


Lesenswert?

Thomas K. schrieb:
> Hängt von deiner Situation ab. Beispiel: Du hast einen Alarmsensor und
> musst auch überprüfen ob der 'Scharf'-Schalter aktiv ist. Wurde kein
> Alarm ausgelöst, ist die Stellung des Schalters eigentlich egal. Da wäre
> einen Verschachtelung besser:
>
>
1
if (Alarm) {
2
>      if (Scharf) {
3
>        GrossBrumburium und Trataa ;
4
>      }
5
>    }


Ist Ansichtssache.

Wenn es dir extrem wichtig ist, im Code zum Ausdruck zu bringen "Erst 
mal brauchen wir einen Alarm", dann kann das eventuell besser sein. 
Genauso wenn du damit rechnest, dass neben 'Scharf' noch andere 
Kriterien dazukommen. Andere Kriterien können zb sein: Wenn der Alarm 
nicht scharf geschaltet ist, dann wird zwar keine Sirene ausgelöst, aber 
eine SMS könnte trotzdem verschickt werden.
1
if (Alarm) {
2
     if (Scharf) {
3
       GrossBrumburium und Trataa ;
4
     }
5
     if (SMS_aktiv) {
6
       verschicke SMS;
7
   }

Dein Programm muss dabei noch gar nicht auf SMS umgebaut sein, alleine 
schon wenn du damit rechnest, das eines Tages machen zu müssen, könnte 
deine Version so gesehen optisch besser sein.
Codemässig bzw. Laufzeitmässig schenkt sich das erst mal sowieso nix.

von Karl H. (kbuchegg)


Lesenswert?

Thomas K. schrieb:
> Die gleichzeitige Abfrage kostet mehr Rechenzeit.

Nö.
Im Gegensatz zum Ur-Pascal ist in C die Short-Circuit Evaluation 
garantiert.
Ist der erste Term in einem && Ausdruck bereits FALSE, wird der zweite 
nicht mehr bewertet.

Darum darf man in C Pointerzugriffe auch so absichern
1
  if( ptr && ptr->irgendwas )
2
    ...
und hat die Garantie(!), dass ein NULL Pointer hier nicht dereferenziert 
wird. (Was im Ur-Pascal immer ein Problem war, weil es vom Compiler 
abhing, ob der Short Circuit Evaluation machte oder nicht)


(Und genau das ist auch der Grund, warum in C sowohl && als auch || 
Sequence Points sind. Die Abarbeitungsreihenfolge  AA && BB  wird 
dadurch zu: erst AA, dann (eventuell) BB festgenagelt. Etwas was ja zb 
bei AA == BB nicht garantiert ist.)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joe B. schrieb:
> Ist das eine besser als das andere?

Von der Logik und vom Ergebnis her sind beide Versionen absolut 
identisch. Der Compiler wird auch für beide Varianten denselben Code 
erzeugen.

Allerdings:

Wenn Du (später in der Programmentwicklung) noch ein else-Statement für 
die erste Bedingung brauchst, dann bist Du mit Variante 2 gekniffen.

Ich mache das selber immer von der Frage abhängig:

     "Brauche ich hier später vielleicht noch ein 'else'?"

Wenn ich dies verneinen kann, nehme ich meist die Kombi-Lösung mit "&&", 
weils meist übersichtlicher ist.

von Dirk (Gast)


Lesenswert?

Hallo :-)

Bei dem Topic war ich skeptisch und auf einen langweiligen Thread 
gefasst.
Vielen Dank daher für diese beiden Beiträge, die ich mir merken werde:

cyblord ---- schrieb:
> Ein berühmtes C-Mantra sagt "Code links halten. Wächter- statt
> Schachtel-IF".

Frank M. schrieb:
> "Brauche ich hier später vielleicht noch ein 'else'?"

Grüße, Dirk

Beitrag #5786324 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.