2016-07-28 25 views
-4

I Programmierung in C gerade erst begonnen, und während sie mit for-Schleifen zu üben, kam ich mit dem folgenden Code auf:Unbeabsichtigte unendlich ‚für‘ Schleife

#include <stdio.h> 

    int main() 
    { 
     int x; 

     for (x=0;x=10;x=x+1) 

      printf("%d\n",x); 

     return 0; 

    } 

Wenn ich den Code ausführen, ich in ein fallen Endlosschleife. In meinem C-Handbuch steht, dass die Bedingung x = 10 immer wahr ist, aber ich kann mich nicht darum kümmern. Wenn ich der Variablen x am Anfang einen Wert von 0 gebe, sollte die for-Schleife nicht einmal starten oder wenn der Wert von x 10 erreicht, sollte die Schleife nicht aufhören?

Vielen Dank im Voraus!

+2

'für (x = 0; x = 10; x = x + 1)' -> 'für (x = 0; x <10; x = x + 1)' –

+2

'=' bedeutet "Zuweisung" oder "Initialisierung" in C, nie "Vergleich". –

+0

oder .. 'für (x = 0; x! = 10; x = x + 1)' –

Antwort

4

Der Bedingungsteil Ihrer for Schleife ist falsch. Was Sie tun, ist:

for (x = 0; x = 10; x = x +1) { 
    // Operations 
} 

Die Bedingung, die Sie hier bekommen haben ist x = 10 die eine Affektiertheit ist. So wird x = 10 10 zurückgeben, was auch true bedeutet. Ihre for Schleife entspricht:

for (x = 0; true; x = x + 1) { 
    // Operations 
} 

diesem Grund sollten Sie eine Endlosschleife bekommen haben, sollten Sie die Affektiertheit Operator = durch die comparason eines mit zwei Gleichheitszeichen == ersetzen. Das bedeutet, die for Schleife wird während x ist gleich bis 10.

EDIT: Wie Virgile in den Kommentaren erwähnt, für die zweite for Schleife, x von 0 bis INT_MAX gehen, dann ist das Verhalten nicht definiert ist. So ist der Code eher aussehen:

for (x = 0; true; x = 10) { 
    // Operations 
} 
+0

Beide 'for' -Schleifen sind nicht äquivalent, abgesehen davon, dass sie unendlich sind. Im ersten Fall wird "x" im Körper der Schleife immer gleich "10" sein, während es im letzteren Fall von "0" auf "INT_MAX" ansteigt (nach dem UB ausgelöst wird). – Virgile

+0

@Virgile: Du hast Recht, der Beitrag wurde bearbeitet! – naccyde

0

Beim Eingeben einer for-Schleife wird zuerst der Initialisierungsteil ausgeführt. Also nach der Schleifeninitialisierung x ist 0.

Bevor Sie den Körper der Schleife, auch das erste Mal, wird die Bedingung überprüft. Die "Bedingung" vergleicht in diesem Fall nicht x mit 10, sondern setzt sie auf 10, da Sie = anstelle von == verwenden.

Da eine Zuweisung als Ausdruck den Wert der Variablen nach der Zuweisung hat, hat der bedingte Ausdruck einen Wert von 10, da dieser Wert x zugewiesen wurde. Da dieser Wert nicht null ist, wird er als wahr ausgewertet und wird dies immer tun.

0

Was Sie versuchen zu tun ist, werden Sie implizit int zu bool in dieser Linie Umwandlung:

for (x=0;x=10;x=x+1) 
     ^^^^ 

hier, x=10; Ergebnisse true

So druckt es 10 jedes Mal, wie Sie den = Zuweisungsoperator verwenden.

for(int x=0;true;x=x+1) 

Was können Sie tun, um die Schleife zu erhalten?

0

Das Problem hier ist, Werfen Sie einen Blick auf die conditio n Teil (2), in diesem was x = 10, bedeutet, dass es nur den Wert 10 zu x zuweist, und es gibt immer "True", also kein Problem, was Sie inkrementieren, es kommt immer zu 10, also Endlosschleife .

Verwandte Themen