Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überraschendes Verhalten im if-else if-Konstrukt (https://www.delphipraxis.net/200241-ueberraschendes-verhalten-im-if-else-if-konstrukt.html)

mariusbenz 2. Apr 2019 09:20

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:
for I := 0 to 5 do
  // Eine Anweisung
  if I = 2 then
    ShowMessage('I = 2');
Bei folgendem Konstrukt geht das ganze dann aber schief:
Delphi-Quellcode:
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');
Nach dem ersten else if (welches false zurückgibt) geht es allerdings nicht weiter ins nächste else if.

Folgendes funktioniert dann wieder:
Delphi-Quellcode:
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');
Mich wundert warum bei einer Schleife eine einfache if-Anweisung nicht in begin end gekapselt werden muss, in meinem Beispiel-Konstrukt allerdings schon.

Neutral General 2. Apr 2019 09:24

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!

Klaus01 2. Apr 2019 09:25

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

mariusbenz 2. Apr 2019 09:28

AW: Überraschendes Verhalten im if-else if-Konstrukt
 
Zitat:

Zitat von Klaus01 (Beitrag 1429315)
.. 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
Kalus

:wall:
Ja, jetzt fühle ich mich dumm

haentschman 2. Apr 2019 09:51

AW: Überraschendes Verhalten im if-else if-Konstrukt
 
Zitat:

Ja, jetzt fühle ich mich dumm
...Blödsinn. Es sei denn du lernst nichts draus. :stupid:

Ich persönlich mache immer ein begin/end. :thumb: Da sehen die Linien (CnPack oder Castalia) besser aus... :stupid:

QuickAndDirty 2. Apr 2019 11:03

AW: Überraschendes Verhalten im if-else if-Konstrukt
 
Zitat:

Zitat von mariusbenz (Beitrag 1429316)
Zitat:

Zitat von Klaus01 (Beitrag 1429315)
.. 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
Kalus

:wall:
Ja, jetzt fühle ich mich dumm

Ach das "pending else" war mal eine echte philosphisches Frage in der C-community...samt Kreuzzügen, Dogmen, Flamewars....&c.
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...

DieDolly 2. Apr 2019 12:04

AW: Überraschendes Verhalten im if-else if-Konstrukt
 
Code ordentlich formatieren dann sieht man sowas auch sofort :P

Delphi-Quellcode:
 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');
Oder mit 2 Leerstellen ist es noch besser sichtbar
Delphi-Quellcode:
 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');
Und so ist es am besten lesbar finde ich und weniger anfällig für Fehler
Delphi-Quellcode:
 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;
Entweder selber ordentlich und richtig formatieren oder STRG+D benutzen.

Delphi.Narium 2. Apr 2019 12:31

AW: Überraschendes Verhalten im if-else if-Konstrukt
 
Noch 'ne Variante:
Delphi-Quellcode:
     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');
Ganz offensichtlich wird es als Einzeiler:
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:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz