For(;;) - was bedeutet das?

Hallo,

ich lerne gerade C und habe deswegen mal bei Google nach einer Hilfe für ein Programm gesucht.
In besagtem Programm steht an einer stelle for(;:wink:.
Kann mir vielleicht jemand erklaeren was das bedeutet?

Danke

Hallo Fragewurm,

In besagtem Programm steht an einer stelle for(;:wink:.
Kann mir vielleicht jemand erklaeren was das bedeutet?

Ist das selbe wie:

while (TRUE)
 {
 }

MfG Peter(TOO)

Hallo Peter,

Ist das selbe wie:

while (TRUE)
{
}

nö, TRUE ist weder in C noch in C++ eine vordefinierte
Konstante (Referenz hier die ISO C und C++ Standards) :wink:

Korrekterweise müsste es also heissen:

C++:
while (true)
{
}

C:
while (1)
{
}

Da es in C historisch gesehen nur eine Definition eines expliziten Wertes für „false“ gegeben hat (definiert als 0), alle anderen Werte aber als „true“ angesehen werden, ergab sich die Situation, dass man ein while (1) auch als while (2), while (256) oder while (~0) oder auch als while (0==0) hätte codieren können. Deswegen hat sich eingebürgert (auch in vielen Coding Standards zu finden), dass man die Version for (;:wink: benutzt, da dort kein expliziter Wert benötigt wird.

Gruss
norsemanna

Um hier mal eine ausformulierte Antwort auf die gestellte Frage zu geben:
for(;:wink:{
}

ist eine Endlosschleife! Alles was in den Block geschrieben wird, wird unendlich wiederholt da in der Funktion for(), keine Abbruchbedingung eingefügt wurde!

Nen Gruß

Hallo for ist keine Funktion, sondern ein Statement. Auch wird zwar vom Programmierer keine Abbruchbedingung hingeschrieben, aber es wird sehr wohl eine Abbruchbedingung vom Compiler eingefügt.

Im C++ Standard ist im übrigen auch eindeutig zu lesen (auch in gängigen C/C++ Büchern), wie das while() Äquivalent zu for() aussieht und ebenfalls ist im Standard zu lesen

-2- Either or both of the condition and the expression can be omitted. A missing condition makes the implied while clause equivalent to while(true).

dass ein „true“ eingefügt wird, wenn condition nicht vom Programmierer vorgegeben wird.

Last but not least, gehe ich davon aus, dass phygirl bereits die Antwort von Peter verstanden hat, man also nicht mehr darauf hinweisen musste, dass es sich um eine Endlosschleife handelt.

Gruss
norsemanna

Hi,
jo das stimmt schon! Da hab ich mich falsch ausgedrückt mit „Funktion“. Allerdings habe ich mit keinem Ton erwähnt das der Compiler da nichts einfügen würde. Allerdings war die Frage auch in Bezug auf implementierung gerichtet und nicht in Bezug wie der Compiler dies dann übersetzt :wink:
Ich wollte halt einfach nur kurz die Frage beantwortet anstatt zu erzählen das statt true in c !=0 verwendet wird.

Gruß :smile:

Hossa :smile:

Dies ist eine spezielle Form der Endlosschleife. Sie ist in der Literatur als „for-ever“ bekannt. Du signalisierst damit dem C/C++ Compiler, dass du als Programmierer die Schleife mit einem „break“ verlassen möchtest.

Eine for-ever-Loop ist nicht äquivalent zu einer while(true)-Loop. Bei einer while(true)-Loop prüft der Compiler nämlich vor dem Schleifendurchlauf, ob der Ausdruck in der Klammer wahr ist. Bei einer for-ever-Loop generiert der Compiler keinen Code für eine eigene Prüfung.

Erst wenn du den Compiler anweist, Optimierungen vorzunehmen, wird er die überflüssige Prüfung bei einer while(true)-Loop erkennen und diesen nutzlosen Code nicht generieren.

Hi Stefan,

dazu faellt mir nur ein: 4*inkorrekt; es sieht so aus, als ob du in der Übersetzerbau Vorlesung nicht aufgepasst hast oder diese schon relativ lang her ist.

dem C/C++ Compiler, dass du als Programmierer die Schleife mit
einem „break“ verlassen möchtest.

Inkorrekt, weil man die Schleife nicht mit einem break verlassen muss, wenn man nicht will. Man kann sie auch anders verlassen und man kann das Verlassen auch bleiben lassen.

Eine for-ever-Loop ist nicht äquivalent zu einer
while(true)-Loop. Bei einer while(true)-Loop prüft der

Inkorrekt, weil das Ganze im Standard so beschrieben steht. Du solltest ihn vielleicht mal lesen.

Compiler nämlich vor dem Schleifendurchlauf, ob der Ausdruck
in der Klammer wahr ist. Bei einer for-ever-Loop generiert der
Compiler keinen Code für eine eigene Prüfung.

Inkorrekt, weil auch fuer eine while(true) kein heutiger C/C++ Compiler mehr ein einziges Byte Code für die Prüfung des Ausdruckes generiert.

Erst wenn du den Compiler anweist, Optimierungen vorzunehmen,
wird er die überflüssige Prüfung bei einer while(true)-Loop
erkennen und diesen nutzlosen Code nicht generieren.

Ebenfalls inkorrekt, denn heutige Compiler erzeugen für offensichtliche ConstExpr Ausdrücke auch ohne Optimierungsflag keinen überflüssigen Code mehr. Meine Compiler haben das im übrigen schon Anfang 89 so gemacht …

Gruss
norsemanna

Hossa :smile:

Zur Äquivalenz von „while(true)“ und „for(;:wink:

Pfff, also eine Schleife der Form

while( true ) { … }

ist syntaktisch zunächst einmal äquivalent zu

for( ; true ; ) { … }

Hier wird ganz klar eine Prüfbedingung angegeben („true“), die bei jedem Schleifendurchlauf abgeprüft werden muss. Und das ist offensichtlich etwas anderes als eine for-ever-Loop

for( ;; ) { … }

bei der überhaupt keine Prüfbedingung angegeben wird.

Eine while(true)-Schleife und eine for-ever-Loop sind also erst dann äquivalent, nachdem der Compiler optimiert hat.

Recht hast du damit, dass meine Aussage zum Verlassen einer for-ever-Schleife nicht vollständig war. Man kann sie natürlich nicht nur mit einem „break“ verlassen, sondern auch mit einem „goto“ oder eben gar nicht. Die beiden letztgenannten Verfahren sind jedoch derart schlechter Programmierstil, dass ich daran nicht ernsthaft gedacht habe.

Wann optimiert ein C/C++ Compiler

Der C/C++ Standard schreibt vor, dass ein Compiler im Debug-Modus keinerlei Optimierungen durchführen soll.

Inkorrekt, weil auch fuer eine while(true) kein heutiger C/C++
Compiler mehr ein einziges Byte Code für die Prüfung des
Ausdruckes generiert.

Wenn Optimierungen eingeschaltet sind, hast du hier vermutlich Recht. Aber ob wirklich alle heutigen C/C++ Compiler Optimierungen durchführen…

Stefan,

„That’s the stupidest thing I’ve ever heard“, um mit Bill Gates zu sprechen. Diese Plattform hier heisst „Wer weiss was“ und nicht „wer kann klug daherreden“

Fakten:
Die Äquivalenz eines for(;:wink: zu while(true) ergibt sich aus §6.5.3-1 und §6.5.3-2 des C++ Standards (INCITS+ISO-IEC-14882-2003.pdf).

Eine while(true)-Schleife und eine for-ever-Loop sind also
erst dann äquivalent, nachdem der Compiler optimiert
hat.

falsch.

Wann optimiert ein C/C++ Compiler

Der C/C++ Standard schreibt vor, dass ein Compiler im
Debug-Modus keinerlei Optimierungen durchführen soll.

Das Wort „debug“ in seinen unterschiedlichen Schreibweisen kommt nur 4 mal im ganzen Standard Dokument vor, zweimal um ein Beispiel Makro debug() zu vereinbaren und zu benutzen, 1 mal um NDEBUG zu erklaeren und dann noch im Inhaltsverzeichnis.

Wo bitte also soll das im Standard stehen ??? Wenn du keine Ahnung hast, dann lass hier jegliche Äußerung zum Standard. Ansonsten darfst du die Paragraphen aus obigem Dokument zitieren, in denen das stehen soll, dann schau ich mir das noch mal an.

Gruss
norsemanna