Semikolon vor else erlaubt, oder nicht?

OP #688418
Lesenswert?

Hallo!

Heute gab es großes gezehter nach einer Klassenarbeit ...

C / C++: Darf vor else ein Semikolon stehen?
Ich habe gelernt: Nein, es sei denn es steht innerhalb eines Blockes 
z.B.
1
if (bedingung)
2
  {
3
    anweisung1 ;
4
    anweisung2 ; // Hier Semikolon erlaubt
5
  }
6
else
7
  anweisung3 ;
So ist es nicht richtig:
1
if (bedingung)
2
  anweisung1 ; // Falsch, hier darf kein Semikolon stehen
3
else
4
  anweisung2 ;

Sollte ich richtig liegen, wo kann ich es nachlesen??? Auf dieses Forum 
verweisen wird den Leherer nicht überzeugen...

Gibt es hierbei einen Unterschied zwischen C und C++?

Gruß und Dank
Michael

[EDIT]Komma durch Semikolon ersetzt
Gast #688429
Lesenswert?

Wenn du mit Komma ein Semikolon meinst, dann sehe ich das 
folgenderweise:
Ein Semikolon schließt eine Anweisung ab. Folglich muss dies nach jeder 
Anweisung gesetzt werden. Egal, ob anschließend ein else kommt oder 
nicht.

Man kann das ja auch einfach mal nen Compiler fragen, bei welchen 
Konstellationen die Warnungen oder Fehler kommen.

MfG
Gast #688431
Lesenswert?

Beide Beispiele sind (zumindest für C) richtig, wobei es 'sauberer' 
wäre, Anweisung 1 und 2 im zweiten Beispiel und Anweisung 3 auch in 
Klammern zu setzen:
1
if (bedingung) {
2
  anweisung1 ; /* Sauberer ist es auch, in C-Code C-Kommentare zu verwenden */
3
} else {
4
  anweisung2 ;
5
}
Moderator Persönliche Seite #688569
Lesenswert?

Du hast das mit Pascal verwechselt.  Bei Pascal ist das Semikolon
ein Trennzeichen zwischen Anweisungen.  Da nach dem if genau eine
Anweisung stehen kann (ggf. halt ein ganzer Block, das ist nach
außen syntaktisch auch nur eine Anweisung), darf dort kein Semikolon
stehen.

Bei C hingegen schließt das Semikolon die Anweisung ab und muss daher
auch vor dem else stehen.  Das hängt damit zusammen, dass in C die
Grenze zwischen Ausdrücken und Anweisungen gegenüber Pascal anders
gelegt ist: ein Ausdruck wird durch das abschließende Semikolon zur
Anweisung.  In Pascal kann ein Ausdruck selbst niemals Anweisung
sein.
Gast #688575
Lesenswert?

>  anweisung1 ; /* Sauberer ist es auch, in C-Code C-Kommentare zu
> verwenden */

Die //-Kommentare sind seit 8 Jahren Teil von C.

> Bei C hingegen schließt das Semikolon die Anweisung ab und muss daher
> auch vor dem else stehen.

Die Betonung liegt auf "muss", da der OP ja fragte, ob es dort stehen 
darf. Es darf nicht nur, sondern muß da stehen.
Gast #688579
Lesenswert?

Die Semikolon sind in beiden Beispielen korrekt gesetzt.
Nach jeder Anweisung kommt ein Semikolon.

if und else Anweisungen sind da erstmal irrelevant.

[c]
if (bedingung)
  anweisung1 ; // Hier MUSS ein Semikolon stehen!
else
  anweisung2 ;
[\c]

Das einfachste ist, wenn Du sowas einfach mal compilierst und guckst was 
passiert. Ein Grundlagenbuch über C könnte allerdings auch nicht schaden 
;)

Gruss!
#688800
Lesenswert?

Wolfgang-G wrote:
>>Das einfachste ist, wenn Du sowas einfach mal compilierst und guckst was
>>passiert.
> nein. für eine Klassenarbeit sollte probieren der falsche Weg sein

Na ja.
Wenn die These lautet, dass ...
1
int main()
2
{
3
  int i = 5, j;
4

5
  if( i == 5 )
6
    j = 8
7
  else
8
    j = 9;
9
}

... korrektes C ist, dann kann man in 20 Sekunden ausprobieren
herausfinden, ob die These stimmen kann oder ob sie komplett
falsch ist. Da der Compiler hier einen Fehler schmeissen wird,
wird die These wohl nicht zu halten sein.

Zeitbedarf mit Compilerunterstützung: vielleicht 30 Sekunden bis
1 Minute.

Das erklärt zwar nicht warum das so ist, vermeidet aber eine
sinnlose Diskussion mit dem Lehrer ob man nun recht hat oder
nicht. Denn nichts ist peinlicher als eine Diskussion mit dem
Lehrer, der dann genau obigen konkreten Test macht und auf
die Fehlermeldung verweist.
Gast #688986
Lesenswert?

Das stimmt zwar, aber einen Compiler sollte man eben nicht als normativ 
ansehen. Nur weil in einem bestimmten Compiler ein Konstrukt 
funktioniert, heißt das nicht, daß das Standard-C ist.
#689032
Lesenswert?

Rolf Magnus wrote:

> funktioniert, heißt das nicht, daß das Standard-C ist.

Da geb ich dir durchaus recht.
Allerdings bin ich der Überzeugung, dass auch der grindigste
C Compiler noch immer mehr von C-Syntax versteht als 99%
aller Informatik-Lehrer da draussen :-)

Wenn der Compiler keinen Fehler meldet, heist das noch lange
nicht, dass es Standard-C ist.
Wenn aber der Compiler einen Fehler meldet, stehen die
Chancen nicht schlecht, dass das Konstrukt auch nach ANSI-C
Regeln tatsächlich fehlerhaft ist.

Und wie heist es so schön: Der Compiler hat immer recht,
vor allen Dingen deshalb, weil du sowieso nichts dagegen
tun kannst :-)
Gast #689497
Lesenswert?

>> Dann frag ich mich warum man Lint-Tools dort immer meckert ;-)
>
>Vielleicht fragst du ja besser dein lint bzw. dessen Hersteller?
>
>Aber welcher lint ist eigentlich wirklich hinreichend auf der Höhe
>der Zeit bezüglich aller C99-Features?


Da hast Du Recht - wir setzen QA-C in der aktuellsten Version ein - es 
stützt sich aber trotzdem nur aus ISO C90 und meckert deswegen über C++ 
Kommentare im C-Code....
#689503
Lesenswert?

Seit ich einmal tierisch auf /* */ reingefallen bin, setze ich es 
überhaupt nicht mehr ein.
Wer denkt sich denn auch sowas blödes aus, daß Kommentare keine 
Kommentare beinhalten dürfen.

Ich benutze // für Zeilenkommentare und #if 0, #endif für mehrzeilige 
Auskommentierungen.
Damit kann ich nie mehr in die Schachtelungsfalle reinfallen.


Peter
Gast #689507
Lesenswert?

> Wer denkt sich denn auch sowas blödes aus, daß Kommentare keine
> Kommentare beinhalten dürfen.

Wozu bräuchte man denn sowas?

> Ich benutze // für Zeilenkommentare und #if 0, #endif für mehrzeilige
> Auskommentierungen.

Ich benutze // für Kommentare am Zeilenende oder zum Auskommentieren 
einzelner Zeilen, /* und */ für mehrzeilige Kommentare und #if 0 und 
#endif für mehrzeiliges "Auskommentieren".

> Damit kann ich nie mehr in die Schachtelungsfalle reinfallen.

Von wo bis wo ein Kommentar geht, sieht man doch sowieso durch's 
Syntax-Highlighting im Editor.
Gast #689514
Lesenswert?

Also wenn ich an meinen Informatiklehrer zurückdenke, kriege ich das 
kalte Grausen.

Daher mein Vorschlag mit dem C Compiler!

Mein Informatiklehrer hat uns sonstwas vom Himmel erzählt... Da half 
kein diskutieren sondern nur der Gegenbeweis.
Gast #689932
Lesenswert?

>> Wozu bräuchte man denn sowas?
> Z.B. dann, wenn man einen längeren Code-Abschnitt inklusive der
> dazugehörigen Kommentare auskommentieren will...

Deshalb benutzt man dazu ja auch #if 0 und #endif. Das hilft auch dem 
Syntaxhighlighter, zwischen Kommentaren und ausgeklammertem Code zu 
unterscheiden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren