Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Quiz] wann darf auf ein Semikolon ein ELSE folgen? (https://www.delphipraxis.net/184517-%5Bquiz%5D-wann-darf-auf-ein-semikolon-ein-else-folgen.html)

mjustin 1. Apr 2015 10:29

Delphi-Version: 2009

[Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
In Object Pascal / Delphi ist es in bestimmten Konstrukten erlaubt, unmittelbar nach einem Semikolon ein else zu verwenden.

Delphi-Quellcode:
<Statement>;
else (...)
Normalerweise ist else nach einem Semikolon nicht möglich und führt zu einer Fehlermeldung beim Kompilieren.
Um welche Konstrukte handelt es sich, bei dem auf ein Semikolon ein else folgen kann?

Update: es gibt mindestens zwei Konstrukte. Das case Konstrukt wurde bereits unten genannt, welches gibt es noch?

mkinzler 1. Apr 2015 10:32

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Bei else vom CASE-Konstrukt ( hiess ursprünglich auch OTHERWISE)

Nanaki 1. Apr 2015 10:32

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Delphi-Quellcode:
case eingabe of
 1: ausgabe := 'Sie haben 1 eingegeben';
 2: ausgabe := 'Sie haben 2 eingegeben';
 3: ausgabe := 'Sie haben 3 eingegeben';
 else ausgabe := 'Sie haben nicht 1, 2 oder 3 eingegeben';
end;


Hier

Edit: Ohhh zu spät

mjustin 1. Apr 2015 10:40

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Danke für die Antworten soweit! Es gibt allerdings noch ein weiteres Konstrukt bei dem nach einem Semikolon ein else folgen kann. Wer kennt es?

Der schöne Günther 1. Apr 2015 10:44

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
try..except..else?

Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
      on EConvertError do
         WriteLn('Ein zahlenloser Tag');
   else
         WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.

mjustin 1. Apr 2015 11:37

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1295757)
try..except..else?

Ja, allerdings würde ich persönlich die Einrückung anders als in der Delphi Dokumentation setzen. In der Delphi Dokumentation wird das else auf die Ebene des except gesetzt:
Delphi-Quellcode:
try
  ...
except
  on EZeroDivide do HandleZeroDivide;
  on EOverflow do HandleOverflow;
  on EMathError do HandleMathError;
else
  HandleAllOthers;
end;
Dagegen würde ich diese Einrückung bevorzugen:
Delphi-Quellcode:
begin
   try
      WriteLn( 'Hallo Welt'.ToInteger() );
   except
      // eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else
      on EConvertError do
         WriteLn('Ein zahlenloser Tag');
      else
         WriteLn('Das Programm ist fehlerhaft. Tauschen sie es um.');
   end;
end.
http://docwiki.embarcadero.com/RADSt.../de/Exceptions
Zitat:

ExceptionBlock ist entweder
eine weitere Anweisungsfolge oder
eine Folge von Exception-Behandlungsroutinen, optional mit nachfolgendem else Anweisungsliste

Namenloser 1. Apr 2015 12:42

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Gab es nicht noch irgendeinen Fall mit Verschachtelung? :gruebel:

Delphi-Quellcode:
  if a then
    if b then
      foo;
  else
    bar;
Das scheint es aber nicht zu sein... zumindest nicht unter FreePascal.

himitsu 1. Apr 2015 13:25

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von Namenloser (Beitrag 1295779)
Gab es nicht noch irgendeinen Fall mit Verschachtelung? :gruebel:

Ich glaub fast ja njö. Das Semikolon gehört ja zum inneren IF und das äußere IF wäre noch nicht beendet,
aber eigentlich sollte ; alles beenden, denn sonst müsste man ja bei
Delphi-Quellcode:
if ... then ... else if ... then ... else if ... then ... else ...;;;


Aber grundsätzlich sollte ELSE nur beim CASE auf ; folgen, denn dort beendet das ; den jeweiligen Case-Block und ELSE folgt auf das ganze CASE-OF.
Und Try-Except ist quasi ein CASE.

Popov 1. Apr 2015 13:40

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von mjustin (Beitrag 1295754)
Danke für die Antworten soweit! Es gibt allerdings noch ein weiteres Konstrukt bei dem nach einem Semikolon ein else folgen kann. Wer kennt es?

Ich würde trotz dem Kein sagen, denn vor Else kann im Grunde kein Semikolon stehen. Ich bin zwar kein Pascal-Crack, aber paar Regeln kenne ich dann doch: jede Anweisung muss/wird in einem Block ausgeführt und das Semikolon gibt das Ende der Anweisung oder Blocks an.

Somit gibt es vor diesen Else kein Semikolon:
Delphi-Quellcode:
case eingabe of
 1: ausgabe := 'Sie haben 1 eingegeben';
 2: ausgabe := 'Sie haben 2 eingegeben';
 3: ausgabe := 'Sie haben 3 eingegeben';
 else ausgabe := 'Sie haben nicht 1, 2 oder 3 eingegeben';
end;
denn auch wenn hier kein
Delphi-Quellcode:
begin..end
Block zwischen
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
steht,
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
sind ein Block.
Delphi-Quellcode:
case..of
wird mit einem
Delphi-Quellcode:
end;
abgeschlossen, nicht mit einem Semikolon wie bei einer If-Abfrage. Also, entweder bilden
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
einen Block oder
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
end;
. Womit es egal ist ob hier vor
Delphi-Quellcode:
else
ein Semokolon steht, denn das hat keinen Einfluß auf
Delphi-Quellcode:
else
. Denn das Semikolon ist in einem Block eingeschlossen.

Wo gibt es Blocks?
Delphi-Quellcode:
begin..end;
repeat..until
while..end;
try..except..else..end;
case..of..else..end;
usw.
Bei
Delphi-Quellcode:
case..of..else
bilden
Delphi-Quellcode:
case..of
und
Delphi-Quellcode:
else
einen Block, genau wie
Delphi-Quellcode:
begin
und
Delphi-Quellcode:
end
. Das Gleiche gilt für
Delphi-Quellcode:
try..except..else
. Somit sind das keine Ausnahmen, denn
Delphi-Quellcode:
except..else
bilden einen Block wie
Delphi-Quellcode:
begin..end
.

Bei
Delphi-Quellcode:
if..then..else
ist das anders.
Delphi-Quellcode:
if..then else
bilden keinen Block. Pascal geht somit davon aus, dass wenn zwischen
Delphi-Quellcode:
then
und
Delphi-Quellcode:
else
kein
Delphi-Quellcode:
begin..end
Block steht, es sich um eine einzelne Anweisung handelt. Und da man
Delphi-Quellcode:
if..then
mit und ohne
Delphi-Quellcode:
else
ausführen kann, sagt das Semikolon, dass hier die Abfrage zu ende ist. Wenn dann in der nächsten Zeile ein
Delphi-Quellcode:
else
auftaucht, dann ist es eine undefinierte Anweisung.

Der schöne Günther 1. Apr 2015 15:40

AW: [Quiz] wann darf auf ein Semikolon ein ELSE folgen?
 
Zitat:

Zitat von mjustin (Beitrag 1295769)
Ja, allerdings würde ich persönlich die Einrückung anders als in der Delphi Dokumentation setzen

Ich verstehe deine Motivation dafür nicht. Das Delphi-Doku-Beispiel ist doch super-übersichtlich und zeigt glasklar ein "Bei speziell A: Tue dies. Bei speziell B: Tue das. ANSONSTEN tue das".

Auch das Syntax-Highlighting beim cnPack (Castalia wahrscheinlich auch) färbt es nach dieser Logik ein.


Außerdem: Du drückst dich. Wo ist mein Preis?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.
Seite 1 von 4  1 23     Letzte »    

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