| Autor |
Beitrag |
WeBsPaCe
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Sa 06.12.08 01:39
Tach,
ich hab leider keine Ahnung, nach was ich noch suchen könnte, um eine Antwort drauf zu bekommen. Hab ja sogar schon Probleme beim Titel formulieren...
Meine Frage ist, ob Delphi bei einer "Boolean-Abfrage" immer von links nach rechts durchgeht. Wichtig bei or-Verknüpfungen:
Delphi-Quelltext 1:
| if (Func1) or (Func2) then ... |
Welche Funktion wird zuerst auf Rückgabewert true geprüft?
Entstanden ist das Problem im Prinzip dabei:
Delphi-Quelltext 1: 2: 3:
| repeat ... until (True) or (Func1); |
Ich müsste mir sicher sein, dass bei diesem Codeschnipsel Func1 niemals aufgerufen wird...
Danke schonmal, bin gespannt!
MfG,
WeBBy
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 06.12.08 01:46
Normal wird von links nach rechts durchgegangen und abgebrochen, wenn der Wert klar ist, das lässt sich aber unter
Projekt-->Optionen-->Compiler-->vollst. Boolesche Auswertung
ändern.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Sa 06.12.08 01:46
hi,
es werden immer alle ausdrücke ausgewertet!
Falls Func1 niemals aufgerufen werden soll, lass es weg 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 06.12.08 01:47
Nein, das Stimmt nicht, siehe oben.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Sa 06.12.08 01:50
k, aber standardmäßig 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 06.12.08 01:53
Standartmäßig wird der Ausdruck nicht weiter geprüft, also ist Standartmäßig die Checkbox deaktiviert.
Demnach würde da
Delphi-Quelltext 1: 2: 3:
| repeat ... until (True) or (Func1); |
func1 NIE ausgeführt!!
|
|
WeBsPaCe 
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Sa 06.12.08 01:55
Hey, super!
Vielen Dank für die Antworten!
Delphi-Quelltext 1: 2: 3: 4:
| repeat ... if True then Break; until Func1; |
Das hilft mir, unabhängig vom Häkchen (da verlass ich mich nicht so gerne drauf, kann irgendwann mal stundenlanges Suchen bedeuten... *g*)
Danke nochmal,
mfG,
WeBBy
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 06.12.08 01:57
Das heisst, dass func1 nie ausgeführt wird und die Schleife nur einmal durchlaufen wird, da Code Hinter
Delphi-Quelltext
Logischerweise immer ausgeführt wird...
|
|
WeBsPaCe 
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Sa 06.12.08 02:00
...jo...  Sinn macht das so keinen... Im Programm ist true dann schon ne Variable, keine Angst. *g*
Btw: so was richtig BEDINGUNGSLOSES hat doch was, oder?... *rrrrrrrrrr* 
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 06.12.08 02:27
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: Sa 06.12.08 11:24
jaenicke hat folgendes geschrieben : | unabhängig von dieser Einstellung kannst du es aber auch direkt beim entsprechenden Code per Compilerdirektive einstellen. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| begin {$B-} if a1 or a2 then MemoX.Lines.Add('---'); {$B+} if a1 or a2 then MemoX.Lines.Add('---'); end; |
|
Aber Vorsicht damit: Nach {$B+} ist dann die komplette Auswertung *eingeschaltet*, auch wenn sie vorher in den Projektoptionen ausgeschaltet war. Das kann dann dazu fuehren, dass spaeterer Code nicht so funktioniert wie erwartet.
Solche Einstellungen sollte man nicht leichtfertig aendern. Wenn man es braucht, sollte man sie lieber komplett fuer eine Unit setzen:
Delphi-Quelltext
Zugegebenermassen verlasse ich mich fast immer darauf, dass diese Option ausgeschaltet ist. Das ist evtl. eine schlechte Angewohnheit...
twm
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 06.12.08 12:35
@dummzeuch: versteh ich nicht. Wenn man für die ganze Unit ausschaltet ist die Gefahr, es zu übersehen, doch viel größer als wenn der Compilerschalter genau an der Anweisung steht wo das unerwartete Verhalten dann später auftritt 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 06.12.08 13:01
Das war jetzt ja nur ein Beispiel, ich selbst schalte es nach dem Einschalten immer wieder aus, damit nicht mehr Code als nötig irgendwo ausgeführt wird.
Wenn ich es irgendwo an oder aus brauche, dann setze ich das explizit vor diesem Code mit entsprechendem Kommentar und Eintrag in der Dokumentation, da gibt es kein unerwartetes Verhalten. Nicht setzen tue ich es nur dort wo es (außer was die Performance angeht) egal ist.
|
|
WeBsPaCe 
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Sa 06.12.08 13:30
Hi,
das klingt eigentlich auch ziemlich clever... Hat nur den Nachteil, dass man sich ja dann auch wieder merken muss, was {$B-} bedeutet...
Zuviel für meinen Kopf. *g*
Danke trotzdem, wusste doch, dass da wieder interessantes Zeugs dabei rauskommt.
MfG,
WeBBy
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 06.12.08 13:32
WeBsPaCe hat folgendes geschrieben : | | Hat nur den Nachteil, dass man sich ja dann auch wieder merken muss, was {$B-} bedeutet... |
Dann kommentierst du deinen Code schlecht. Sowas kommt als Kommentar dazu bei mir, denn manchmal bin ich mir auch nicht bei jedem Schalter sicher was er heißt. Du kannst ja auch die lange Form BOOLEVAL verwenden  .
// EDIT:
Zudem musst du ja auch dazu schreiben im Komentar, dass man sich darauf verlassen kann, dass etwas nicht ausgeführt wird, etc., sonst ist der Code später ohnehin kaum lesbar.
|
|
WeBsPaCe 
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Mi 10.12.08 22:43
Tach.
Doch noch ne Frage, allerdings steht die auch schon im Titel, deswegen kein neuer Thread: liest Delphi das von immer links nach rechts, oder auch mal durcheinander?
Mal ein hübsches Beispiel:
Delphi-Quelltext 1: 2: 3:
| if (Application.MessageBox('Traust du dich?', '', 4+48) = 6) and (Application.MessageBox('Bist du dir sicher?', '', 4+48) = 6) then ShowMessage('Du bist wirklich tapfer...'); |
Wäre ja wichtig, dass die eine Frage immer vor der anderen gestellt wird, sonst macht die eine keinen Sinn...
Wisst ihr da auch was?
MfG,
WeBBy
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 10.12.08 22:46
Er fängt links an (ausser es wäre geklammert) und wenn , wie in deinem Fall der erste Ausdruck fasch ist, hört er auf, weil der gesammte Ausdruck nicht mehr wahr werden kann!
_________________ Markus Kinzler.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 10.12.08 22:54
|
|
WeBsPaCe 
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Mi 10.12.08 23:13
Tach.
Danke, wo kann man sowas nur nachschlagen...?!
jaenicke hat folgendes geschrieben : | mkinzler hat folgendes geschrieben : | | und wenn , wie in deinem Fall der erste Ausdruck fasch ist, hört er auf, weil der gesammte Ausdruck nicht mehr wahr werden kann! | Vorausgesetzt das ist so eingestellt und nicht die vollständige Auswertung aktiviert. (Das wurde ja bereits oben erwähnt.) |
Gib's ihm!
Vielen Dank ihr beiden!!!
MfG,
WeBBy
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 10.12.08 23:34
WeBsPaCe hat folgendes geschrieben : | Danke, wo kann man sowas nur nachschlagen...?! |
In der Hilfe  .
Schau mal unter dem Stichwort "Boolesche Operatoren" --> "Operatoren" etwas weiter unten unter "Vollständige Auswertung und Kurzschlussverfahren im Vergleich". | Hilfe zu Delphi 2009 hat folgendes geschrieben: | Der Compiler unterstützt zwei Auswertungsmodi für die Operatoren and und or: die vollständige Auswertung und das Kurzschlussverfahren. Bei der vollständigen Auswertung werden alle Operanden eines and- oder or-Ausdrucks auch dann ausgewertet, wenn das Resultat des gesamten Ausdrucks bereits feststeht. Das Kurzschlussverfahren geht streng von links nach rechts vor und wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht.
[...] |
Und so weiter, das wird da noch genauer beschrieben, auch die Compilerdirektive.
Der Link für die Hilfe zu Delphi 2009:
ms-help://embarcadero.rs2009/devcommon/expressions_xml.html
bei 2006 lautet er:
ms-help://borland.bds4/bds4ref/html/Expressions.htm#BooleanOps
Ansonsten findet man im Internet einiges, und wenn ich dann was lese, dann merke ich mir das auch.
Ich schaue mir auch mal den Assemblercode an, den Delphi erzeugt. Das zeigt auch schon einiges.
Es gibt auch Newsgroups mit interessanten Diskussionen.
Vielleicht interessiert dich ja dies:
www.delphi-treff.de/backstage/interna/
|
|
|