Keine loop-Bedingung in der for-und while-Schleife
while(cond) //fine
for(;cond;) //fine
aber wenn ich entfernen Sie die bedingten Teil
while() //syntax compilation error
for(;;) //Infinite loop
Wie diese Schleifen werden intern umgesetzt ?
Oder,wie funktioniert compiler (parser), wissen, dass der leere Zustand, in while
ist fehlerhaft und in for
als Unendlich?
Ich nicht finden, etwas über diese besonders, ich glaube, Leute wie mich (die Anfänger) in C haben vielleicht gleiche Verwirrung
- Der compiler weiß, weil das ist, wie Sie definiert sind?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der standard verlangt, dass die weggelassen Bedingung für
for
Schleife wird ersetzt durch eine nicht-null Konstante:Vom C11 6.8.5.3: (Hervorhebung von mir)
Da es keine solche Anforderung für
while
loop (wenn die Bedingung weggelassen), ich glaube, es bleibt der Implementierung des Compilers.Es gibt keine technischen Gründe erklären, warum das eine funktioniert und der andere nicht. Es ist eine menschliche Faktoren, die Berücksichtigung der Sprache der Designer. Sie fühlte, dass eine unendliche Schleife mit
for (;;)
mehr Sinn alswhile ()
. Möglicherweise waren Sie beeinflusst von ALGOL, eine Sprache, die von Höhlenmenschen.Weil die Sprache, die definition gibt es, in der sowohl die syntax (Grammatik) und Semantik.
Hier ist die syntax für eine
while
Schleife:und hier ist die syntax für eine
for
Schleife (wie der C2011):Tiefgestellt opt in jedem
expressionopt
imfor
- Anweisung gibt an, dass der entsprechende Ausdruck ist optional. Verstärkt wird dies durch den text:Dagegen, die Kontrolle der expression der
while
Aussage ist nicht als optional markiert, die auch verstärkt im text:Nicht viel Raum, es zu interpretieren, dass die Kontrolle der expression kann ausgelassen werden.
Die Bedingungen bestimmen, syntax und semantische Korrektheit eines Programms kodiert die Sprache, die Grammatik. Sprache Grammatiken gemacht werden, die durch Sprache, Macher, Sie bestimmen die Sprache, look-and-feel, wie im Fall des C.
Ich nehme an, dass die grundlegende intuition hinter
for(;;)
undwhile(1)
ist, dass ein Teil derfor(;;)
kann weggelassen werden, wennwhile(1)
ist völlig ausreichend für die Erstellung von Endlosschleifen, in der Erwägung, dasswhile()
wäre ein hacky-Ecke Fall nur aus einem schmalen Gehäuse.Es ist Teil der C-syntax. Jede Programmiersprache hat Ihre formale Grammatik-Spezifikation (hier ist C formale Grammatik in BNF - das also, was syntaktisch korrekt ist und was nicht. In C formale Grammatik kann man sehen, dass während muss das Aussehen:
Worte/Symbole in einfache Anführungszeichen (terminal-Symbole) sind zwingend erforderlich: 'während', '(' und ')'.
Nicht-zitierten Worte (nicht-terminal-Symbole) sind etwas das ist auch angegeben in der formalen Grammatik. Wenn Sie analysierten C formale Grammatik, würden Sie sehen, dass es exp kann nicht werden nichts. Auf der anderen Seite, wenn Sie sah für würden Sie sehen, dass es Aussehen kann:
( | bedeutet ODER).
Beim kompilieren Programm, lexikalische Analysator (Teil des Compilers) prüft, ob der code syntaktisch korrekt ist (D. H. entspricht der formalen Grammatik) und abhängig von der Quell-code führt andere Aktionen aus.