![]() |
Delphi-Version: 10.2 Tokyo
Überraschendes Verhalten im if-else if-Konstrukt
Guten Morgen,
mir ist gerade etwas in einem if-else if Konstrukt aufgefallen, von dem ich der festen Überzeugung war, dass das geht. Ich spare mir bei Schleifen und if-Abfragen gerne das begin-end wenn nur eine Anweisung kommt. Eine Anweisung kann dann auch bei Schleifen auch eine if-Abfrage + Anweisung sein. Beispiel:
Delphi-Quellcode:
Bei folgendem Konstrukt geht das ganze dann aber schief:
for I := 0 to 5 do
// Eine Anweisung if I = 2 then ShowMessage('I = 2');
Delphi-Quellcode:
Nach dem ersten else if (welches false zurückgibt) geht es allerdings nicht weiter ins nächste else if.
if Form1.Caption = 'ksjhdgk' then
ShowMessage('1') else if Form1.Caption = 'fgjfstj' then // eigentlich ja auch eine Anweisung if Button1.Caption = 'Button1' then ShowMessage('2') else if Form1.Caption = 'Form1' then ShowMessage('3'); Folgendes funktioniert dann wieder:
Delphi-Quellcode:
Mich wundert warum bei einer Schleife eine einfache if-Anweisung nicht in begin end gekapselt werden muss, in meinem Beispiel-Konstrukt allerdings schon.
if Form1.Caption = 'ksjhdgk' then
ShowMessage('1') else if Form1.Caption = 'fgjfstj' then begin if Button1.Caption = 'Button1' then ShowMessage('2'); end else if Form1.Caption = 'Form1' then ShowMessage('3'); |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Und was lernen wir daraus?
Wobei ich zugeben muss, dass ich das zu einem gewissen Grad auch mache. Aber nur wenn die Anweisungen nur eine simple (einzeilige) Zuweisung oder Methodenaufruf ist. Sobald da ein mehrzeiliger Block hin soll mache ich ein begin/end drum, weil mir das auch sonst zu unübersichtlich ist, auch wenn es nur als eine Anweisung zählt und (in den meisten Fällen) so funktioniert.
Delphi-Quellcode:
if (x > y) then
ShowMessage('X ist größer als Y!'); // Ja if (x < y) then for i := x to y do ShowMessage('!'); // Nein! |
AW: Überraschendes Verhalten im if-else if-Konstrukt
.. das else bezieht sich immer auf das letzte if.
Wenn das nicht gewünscht ist musst Du mit begin end arbeiten, siehe letztes Beispiel. Überraschend ist das Verhalten nicht. Grüße Klaus |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Zitat:
Ja, jetzt fühle ich mich dumm |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Zitat:
Ich persönlich mache immer ein begin/end. :thumb: Da sehen die Linien (CnPack oder Castalia) besser aus... :stupid: |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Zitat:
Python hätte dank deiner Code formatierung die von dir intendierte logic auch umgesetzt...What you see is what you get...So lange du keine anderen Whitespaces als Leerzeichen verwendest... Wärst du ein Arbeitskollege würde dieser Post trotzdem für immer mit deinem Namen verbunden bleiben... |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Code ordentlich formatieren dann sieht man sowas auch sofort :P
Delphi-Quellcode:
Oder mit 2 Leerstellen ist es noch besser sichtbar
if Form1.Caption = 'ksjhdgk' then
ShowMessage('1') else if Form1.Caption = 'fgjfstj' then // eigentlich ja auch eine Anweisung if Button1.Caption = 'Button1' then ShowMessage('2') else if Form1.Caption = 'Form1' then ShowMessage('3');
Delphi-Quellcode:
Und so ist es am besten lesbar finde ich und weniger anfällig für Fehler
if Form1.Caption = 'ksjhdgk' then
ShowMessage('1') else if Form1.Caption = 'fgjfstj' then // eigentlich ja auch eine Anweisung if Button1.Caption = 'Button1' then ShowMessage('2') else if Form1.Caption = 'Form1' then ShowMessage('3');
Delphi-Quellcode:
Entweder selber ordentlich und richtig formatieren oder STRG+D benutzen.
if Form1.Caption = 'ksjhdgk' then
begin ShowMessage('1'); end else if Form1.Caption = 'fgjfstj' then begin // eigentlich ja auch eine Anweisung if Button1.Caption = 'Button1' then begin ShowMessage('2'); end else if Form1.Caption = 'Form1' then begin ShowMessage('3'); end; end; |
AW: Überraschendes Verhalten im if-else if-Konstrukt
Noch 'ne Variante:
Delphi-Quellcode:
Ganz offensichtlich wird es als Einzeiler:
if Form1.Caption = 'ksjhdgk' then ShowMessage('1')
else if Form1.Caption = 'fgjfstj' then if Button1.Caption = 'Button1' then ShowMessage('2') else if Form1.Caption = 'Form1' then ShowMessage('3');
Delphi-Quellcode:
if Form1.Caption = 'k' then ShowMessage('1') else if Form1.Caption = 'f' then if Button1.Caption = 'Button1' then ShowMessage('2') else if Form1.Caption = 'Form1' then ShowMessage('3');
Und nein: Das ist kein guter Programmierstil. Wer geschachtelte If-Then-Else-Konstrukte ohne Begin-End schreibt, sollte die implementierte Logik schon sehr gut abstrahieren können, sonst wird es sehr schnell sehr unübersichlich und extrem fehleranfällig. Kurzer Code ist gut. Übersichtlicher und verständlicher ist besser ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz