2010-09-25 18 views
5

Ich habefor-Schleife fehlt Initialisierung

gesehen
for(;;) 

und

for (; *s != '\0'; s++) 

Warum es leer, wie das ist. Vielen Dank.

+0

Für alle aktuellen Antwort: Ich glaube, er will wirklich wissen, was der Rohling für ist. –

Antwort

17

Die for Anweisung funktioniert wie:

for (initialization; test-condition; update)

und einige oder alle dieser drei kann (links leer) weggelassen werden. Also:

  • for (;;) ist eine Endlosschleife entspricht while (true), weil es keine Testbedingung ist. Tatsächlich wäre for (int i=0; ;i++) auch eine Endlosschleife .

  • for (; *s != '\0'; s++) ist eine Schleife ohne Initialisierung. s wird auf den Anfang von (wahrscheinlich) einer Zeichenfolge zeigen und wird inkrementiert, bis das Nullzeichen '\0' erreicht wird, das das Ende der Zeichenfolge angibt. Dies bedeutet im Wesentlichen eine Schleife durch alle Zeichen des Strings s

Die Schleife noch unterbrochen wird, wenn es in der Schleife eine break Anweisung ist, oder ein Aufruf an exit(), etc ...

+1

'\ 0' ist der' NUL' Buchstabe.NUL' und 'NULL' sind unterschiedlich. –

+3

@Prasoon Einige Leute (wie ich) nennen es einfach den [Nullzeichen] (http://en.wikipedia.org/wiki/Null_character) – NullUserException

1

bedeutet dies tun immer

für (Anfangszustand; Inkrement; Endbedingung); Sie können weglassen eines dieser

http://en.wikipedia.org/wiki/For_loop

Die drei Steuerausdrücke siehe hier durch Semikolons getrennt sind von verließ den initializer Ausdruck, den Schleifentestausdruck, und das Zählen Ausdruck nach rechts . Der Initialisierer wird genau einmal direkt am Anfang der Schleife ausgewertet. Der Loop-Test-Ausdruck wird bei am Anfang jeder Iteration durch die Schleife ausgewertet und bestimmt, wann die Schleife beendet werden soll. Schließlich wird der Zählungsausdruck bei am Ende jeder Schleifeniteration ausgewertet - selbst , wenn continue aufgerufen wird - und normalerweise ist verantwortlich für die Änderung der Schleife Variable.

In den meisten Sprachen, die diesen Typ von for-Schleife bereitstellen, ist jeder der drei Regelkreisausdrücke optional. Wenn nicht angegeben, wird der Loop-Test-Ausdruck als immer wahr angenommen, während die Initialisierungs- und Zählungsausdrücke als No-Ops behandelt werden, wenn sie weggelassen werden. Die Semikola in der Syntax sind ausreichend, um die Auslassung von einer der Ausdrücke anzuzeigen.

4

for(;;) ist eine Endlosschleife. Es ist genau das selbe wie while (true).

Der Grund dafür ist, dass, wenn die mittlere Bedingung in einer for Schleife leer ist, es als immer wahr interpretiert wird.

for (; *s != '\0'; s++) wird zum Lesen Zeichenfolgen Zeichen für Zeichen verwendet. Dieser Ansatz funktioniert, da jede C-Zeichenfolge mit einem Nullzeichen endet (\0).

2

Die Teile, die leer sind, tun im Wesentlichen nichts. So erzeugt for (;;) eine Endlosschleife, die gar nichts tut und niemals beendet wird, weil keine Bedingung in der Schleife vorhanden ist. Ihr zweites Beispiel:

for (; *s != '\0'; s++) 

ist nur eine normale Schleife ohne Initialisierungsausdruck. Dies beruht auf der Tatsache, dass s bereits einen Anfangswert hat und nur Schleifen, bis es das Ende der Zeichenfolge erreicht.

6

Es ist "so leer", weil der Autor des Codes es leer gelassen hat. Der Autor wollte/muss nichts in dem entsprechenden Abschnitt der for Anweisung tun, also wurde es leer gelassen.

for (;;) ist eine Anweisung, die unbegrenzt wiederholt wird (es sei denn, sie wird innerhalb des Zykluskörpers unterbrochen).

for (; *s != '\0'; s++) ist eine Anweisung, die keinen Initialisierungsabschnitt benötigt, da alles Notwendige (wie der Anfangswert von s) bereits vor dieser for Anweisung initialisiert wurde.

1

while(1) und while(true) sind die gleichen wie for(;;)