AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Überraschendes Verhalten im if-else if-Konstrukt

Überraschendes Verhalten im if-else if-Konstrukt

Ein Thema von mariusbenz · begonnen am 2. Apr 2019 · letzter Beitrag vom 2. Apr 2019
Antwort Antwort
mariusbenz

Registriert seit: 6. Mär 2015
23 Beiträge
 
#1

Überraschendes Verhalten im if-else if-Konstrukt

  Alt 2. Apr 2019, 09:20
Delphi-Version: 10.2 Tokyo
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 = 'ksjhdgkthen
  ShowMessage('1')
else if Form1.Caption = 'fgjfstjthen
  // eigentlich ja auch eine Anweisung
  if Button1.Caption = 'Button1then
    ShowMessage('2')
else if Form1.Caption = 'Form1then
  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 = 'ksjhdgkthen
  ShowMessage('1')
else if Form1.Caption = 'fgjfstjthen
  begin
    if Button1.Caption = 'Button1then
      ShowMessage('2');
  end
else if Form1.Caption = 'Form1then
  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.

Geändert von mariusbenz ( 2. Apr 2019 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.000 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 2. Apr 2019, 09:24
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!
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 2. Apr 2019 um 09:27 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.281 Beiträge
 
Delphi XE7 Professional
 
#3

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

  Alt 2. Apr 2019, 09:25
.. 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
Klaus

Geändert von Klaus01 ( 2. Apr 2019 um 09:35 Uhr)
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
23 Beiträge
 
#4

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

  Alt 2. Apr 2019, 09:28
.. 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

Ja, jetzt fühle ich mich dumm
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.117 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

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

  Alt 2. Apr 2019, 09:51
Zitat:
Ja, jetzt fühle ich mich dumm
...Blödsinn. Es sei denn du lernst nichts draus.

Ich persönlich mache immer ein begin/end. Da sehen die Linien (CnPack oder Castalia) besser aus...
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.518 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

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

  Alt 2. Apr 2019, 11:03
.. 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

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...
Andreas
#PerfMatters

Geändert von QuickAndDirty ( 2. Apr 2019 um 11:06 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
814 Beiträge
 
#7

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

  Alt 2. Apr 2019, 12:04
Code ordentlich formatieren dann sieht man sowas auch sofort

Delphi-Quellcode:
 if Form1.Caption = 'ksjhdgkthen
  ShowMessage('1')
 else if Form1.Caption = 'fgjfstjthen
  // eigentlich ja auch eine Anweisung
  if Button1.Caption = 'Button1then
   ShowMessage('2')
  else if Form1.Caption = 'Form1then
   ShowMessage('3');
Oder mit 2 Leerstellen ist es noch besser sichtbar
Delphi-Quellcode:
 if Form1.Caption = 'ksjhdgkthen
   ShowMessage('1')
 else if Form1.Caption = 'fgjfstjthen
   // eigentlich ja auch eine Anweisung
   if Button1.Caption = 'Button1then
     ShowMessage('2')
   else if Form1.Caption = 'Form1then
     ShowMessage('3');
Und so ist es am besten lesbar finde ich und weniger anfällig für Fehler
Delphi-Quellcode:
 if Form1.Caption = 'ksjhdgkthen
  begin
   ShowMessage('1');
  end
 else if Form1.Caption = 'fgjfstjthen
  begin
   // eigentlich ja auch eine Anweisung
   if Button1.Caption = 'Button1then
    begin
     ShowMessage('2');
    end
   else if Form1.Caption = 'Form1then
    begin
     ShowMessage('3');
    end;
  end;
Entweder selber ordentlich und richtig formatieren oder STRG+D benutzen.

Geändert von DieDolly ( 2. Apr 2019 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
981 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 2. Apr 2019, 12:31
Noch 'ne Variante:
Delphi-Quellcode:
     if Form1.Caption = 'ksjhdgkthen ShowMessage('1')
else if Form1.Caption = 'fgjfstjthen if Button1.Caption = 'Button1then ShowMessage('2')
                                  else if Form1.Caption = 'Form1then ShowMessage('3');
Ganz offensichtlich wird es als Einzeiler:
if Form1.Caption = 'kthen ShowMessage('1') else if Form1.Caption = 'fthen if Button1.Caption = 'Button1then ShowMessage('2') else if Form1.Caption = 'Form1then 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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf