if Abfrage - Verschachteln oder gleichzeitig?

OP #2840356
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
#2840367
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
Persönliche Seite #2840385
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
   }
#2840390
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.
Persönliche Seite #2840396
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.
#2840397
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.
#2840398
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.)
Moderator Persönliche Seite #2840404
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.
Beitrag #5786324 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren