2012-11-16 12 views
6

Angenommen, ich möchte eine Nachricht in C fünf Mal mit einer for Schleife drucken. Warum ist, dass es, wenn ich ein Semikolon nach for-Schleife wie folgt hinzu:Wirkung von Semikolon nach 'für' Schleife

for (i=0;i<5;i++); 

die Meldung nicht mehr als 5-mal gedruckt, aber es funktioniert, wenn ich nicht da das Semikolon setzen Sie?

Antwort

8
for (i=0;i<5;i++); 

entspricht

for (i=0;i<5;i++){} 
23

Semikolons ist eine legitime Aussage null Anweisung* genannt, das bedeutet "nichts tun". Da die for Schleife eine einzelne Operation ausführt (die ein Block sein könnte, der in {} eingeschlossen ist), wird Semikolon wie der Körper der Schleife behandelt, was zu dem von Ihnen beobachteten Verhalten führt.

  • Versuch wird fünfmal wiederholt for (i=0;i<5;i++)
  • ... nichts tun (Semikolon)
  • Öffnen Sie einen neuen Bereich für lokale Variablen:

    Der folgende Code

    for (i=0;i<5;i++); 
    { 
        printf("hello\n"); 
    } 
    

    wird wie folgt interpretiert {

  • ... Drucken "Hallo"
  • Schließen Sie den Umfang }

Wie Sie die Operation sehen können, die wiederholt wird ist ;, nicht die printf.


* Siehe K&R, Abschnitt 1.5.2

+2

Semikolon ist kein "Operator". Es beendet eine "Anweisung" und es ist gültig, dass die Anweisung nichts enthält. Einige Compiler warnen davor, weil es ein häufiger Fehler ist. Leere Klammern '{}' ist der bevorzugte Weg, um nichts zu tun. – ams

+0

Semikolon ist ein * Punctuator *, aber kein * Operator *. – ouah

+0

@ams Bitte sehen Sie eine Bearbeitung. Ich habe mich geirrt, es als Operator zu bezeichnen, es ist eine Aussage (zumindest nach K & R) – dasblinkenlight

3

Die Aussage, bestehend aus nur dem ; Token die null Anweisung genannt wird und es funktioniert einfach ... nichts.

Zum Beispiel das gilt:

void foo(void) 
{ 
    ; 
    ; 
    ; 
} 

Es kann überall eine Anweisung verwendet werden kann verwendet werden, zum Beispiel in:

if (bla) 
    ; 
else 
    ; 

Siehe C Standard Absatz:

(C99, 6.8.3p3) "A null statement (consisting of just a semicolon) performs no operations."

1

Dieser Code unten wird "Hello" 5 Mal drucken.

+1

Eigentlich nein, das wird nicht Hallo 5 mal drucken; Es wird Hello unendlich viele Male drucken. Dies liegt daran, dass die Bedingung 'i <5, printf ("Hello \ n"); 'ist und der Kommaoperator seine LHS (' i <5') auswertet und das Ergebnis ignoriert, dann wertet das RHS ('printf (" Hello \ n ")'), die 6 zurückgibt, weil sie 6 Zeichen in die Standardausgabe schreibt; Weil 6 wahr ist (es ist nicht Null), wird die Schleife unendlich fortgesetzt. Mit meinen Standard-Compiler-Optionen für GCC (einschließlich "-Werror") kompiliert der Code nicht: 'Fehler: linker Operand des Komma-Ausdrucks hat keine Wirkung [-Werror = unbenutzter Wert]'. –

0

Viele Compiler zeigen einen Syntaxfehler, wenn Sie nach einer for-Schleife ein Semikolon einfügen, aber nach gcc-Compiler (Linux) oder Dev-cpp können Sie nach einer for-Schleife ein Semikolon einfügen, das keine Fehler anzeigt.

Zum Beispiel

for(int i=0;i<=5;i++); 

oder

for(int i=0;i<=5;i++) 
{//blank body} 

Aus dem obigen Beispiel wird deutlich, wenn wir nach dem leeren Klammern oder Semikolon setzen für Schleife, das bedeutet, dass wir keine Variable eingetragen.

Kommen Sie nun zu Ihrer Frage.
Wenn Sie hallo fünf mal ausdrucken möchten, haben Sie Ihr Programm zu schreiben, wie

for(int i=0;i<5;i++) 
{ 
    printf("hello"); 
} 

ich Sie
prost verstehen hoffen !!
Rahul Vashisth