Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Verschachtelte if strukturen


klezmor - Di 15.11.05 19:30
Titel: Verschachtelte if strukturen
Hallo,
Wenn ich einen boolschenausdruck habe, der zu überprüfen ist und dieser wiederum aus mehreren boolschenausdrücken zusammengesetzt ist mit and oder or gibt es ja mehrere möglichkeiten dies vorzunehmen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (z.B.a=true) then 
begin if (b=true) then
      begin if (c=true) then
            begin
            test;
            end;
      end;
end;


oder.


Delphi-Quelltext
1:
2:
3:
4:
if ((a=true)and(b=true)and(c=true)) then
begin
test;
end;



was ist der interene unterschied der 2 versionen, gibt es eine schnellere methode oder sind beide intern gleich schnell. Oder gibt es sonstige unterschiede?

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Sonstiges verschoben am Di 15.11.2005 um 18:35


BenBE - Di 15.11.05 19:43

Gemeinsam ist beiden Versionen, dass sie ohne Delphi-Tag grausam aussehen.

Der Unterschied liegt daran, dass das erste Statement vom Compiler schwerer optimiert wird (wenn überhaupt). Bei der zweiten Anweisung bricht nämlich die Auswertung ab, wenn feststeht, dass nicht mehr True rauskommen kann.


klezmor - Di 15.11.05 19:59

Was ist ein delphi-tag?

habe deine aussage nicht ganz verstanden, wenn bricht die auswertung ab und wieso ist das eine nicht so optimiert?


BenBE - Di 15.11.05 20:08

user profile iconklezmor hat folgendes geschrieben:
Was ist ein delphi-tag?

Sind diese netten Konstruktionen, die freundlicherweise durch die Moderatoren bereits nachgereicht wurden.
@CS: THX.
user profile iconklezmor hat folgendes geschrieben:
habe deine aussage nicht ganz verstanden, wenn bricht die auswertung ab und wieso ist das eine nicht so optimiert?


Angenommen, du hast A:=True, B:=False und C:=True;

Im ersten Beispiel wäre die Ausführung If A=true Then, If B = True Then --> Abbruch, da zweite Bedingung nicht erfüllt. Der Compiler macht in diesen Fällen keine Sprungoptimierungen, d.h. das u.U. dein Source etwas größer wird.

Beim zwiten Source macht der Compiler ein If A and B and C Then draus, wobei er and C nur ausführt, wenn er sieht, dass der erste Ausdruck überhaupt gilt. Daher hast Du bei der zweiten Version einen Vergleich weniger drin, was eben (etwas) Zeit spart ...


klezmor - Di 15.11.05 20:37

Ich hätte das jetzt gerade andersherum gedacht, wenn z.B. a=false ist dann kümmert er sich bei der ersten variante gar nicht mehr um b und c, also müsste doch die erste variante schneller sein, ich verstehe die logik dahinter nicht ganz.


BenBE - Di 15.11.05 21:15

Nicht ganz:

Siehe:
1. Variante:

1. Abfrage A=True
2. Abfrage B=True
3. Abfrage C=True

2. Variante:

1. Abfrage and B=True
2. Abfrage C=True

UC?