Antwort 1:

In Bezug auf den generierten Code sollte jeder moderne C-Compiler die gleichen Ergebnisse liefern.

Autoren, Professoren und andere, die sagen, dass (;;) mehr Overhead verursacht, entweder (a) nicht wissen, wovon sie sprechen, oder (b) mit alten oder kaputten Compilern arbeiten. for (;;) erzeugt keinen zusätzlichen Overhead, da es keine Bedingung und keine Schrittfolge für eine Schleifenvariable gibt. Wenn überhaupt, während (1) in einem alten, nicht optimierenden Compiler möglicherweise tatsächlich mehr Overhead erzeugt, da er blitzschnell prüft, ob 1 am Anfang jeder Iteration ungleich Null ist. Moderne Compiler tun dies nicht.

Wenn Sie in einigen Compiler-Implementierungen die Warnstufen hoch genug einstellen oder ein fusselartiges Dienstprogramm verwenden, wird möglicherweise eine Warnung für while (1) oder eine entsprechende Warnung angezeigt, die besagt, dass ein bedingter Ausdruck konstant ist. for (;;) erzeugt keine solche Warnung, da es überhaupt keinen bedingten Ausdruck gibt. Ich habe an Projekten gearbeitet, in denen wir Null-Warnungen kompilieren wollten, und habe mich daher für (;;) anstatt für eine Weile (1) als Äquivalent entschieden. Außerdem kann nach (;;) leichter gesucht werden als nach den while-Varianten.

Übrigens, wenn Sie währenddessen verwenden, ist es besser zu sagen:

während (wahr)

als zu sagen:

während (1)

obwohl der erstere mehr Tippen erfordert.

In modernem C (d. H. Seit C99 im Jahr 1999) sollten Sie keine eigene Version von TRUE erstellen. Fügen Sie stattdessen die Header-Datei stdbool.h hinzu, und Sie haben Zugriff auf den definierten Bool-Datentyp (anstatt das Schlüsselwort _Bool verwenden zu müssen) und die Symbole true und false. Deine eigenen wahren / falschen Werte zu rollen ist so…

… 1998.


Antwort 2:

Der Standard: Standard C ++

6.5.3 Die for-Anweisung1 Die for-Anweisung für die (for-init-Anweisung conditionopt; expressionopt) -Anweisung entspricht [Code] {for-init-Anweisung while (Bedingung) {Anweisungsausdruck; }} [/ code] mit der Ausnahme, dass sich die in der for-init-Anweisung deklarierten Namen in derselben deklarativen Region befinden wie die in der Bedingung deklarierten, und mit der Ausnahme, dass eine continue in-Anweisung (die nicht in einer anderen Iterationsanweisung enthalten ist) einen Ausdruck vor re ausführt auswertender Zustand. [Anmerkung: Die erste Anweisung gibt daher die Initialisierung für die Schleife an. die Bedingung (6.4) spezifiziert einen Test, der vor jeder Iteration durchgeführt wird, so dass die Schleife verlassen wird, wenn die Bedingung falsch wird; Der Ausdruck gibt häufig eine Erhöhung an, die nach jeder Iteration durchgeführt wird. - Endnote] 2 Eine oder beide Bedingungen und der Ausdruck können weggelassen werden. Eine fehlende Bedingung macht die implizite while-Klausel zu while (true).

Könnte sein


Antwort 3:

Jeder Compiler, der es wert ist, generiert in beiden Fällen identischen Code.

Eine mögliche Präferenz für die Option für (;;) ist, dass einige (viele?) Leute es als "schlechten Stil" ansehen, numerische Konstanten im Code zu verwenden. Das heißt, du schreibst nicht

x + = 10;

aber du schreibst

static const int my_constant_value = 10;

(...)

x + = mein_konstanter_Wert;

Der Grund dafür ist, dass alle numerischen Konstanten explizit deklariert werden (und vorzugsweise am Anfang der Quelldatei, anstatt in der gesamten Datei verteilt zu sein), was zu einem besser verwaltbaren Code führt.

Es macht offensichtlich keinen Unterschied in Bezug auf for (;;) vs while (1), aber es ist immer noch unangenehm, eine '1' in einem Code ohne Zahlen zu sehen.

In C ++ (und seit C99 auch in C) können wir "while (true)" schreiben, aber das ist sogar länger als "while (1)", das selbst länger ist (um 1 Zeichen) als "for (;;)" ".