Ist der Code “while(condition);” gültig und was bedeutet das?

Lesezeit: 6 Minuten

Benutzer-Avatar
Benutzer500817

Können wir Semikolon setzen wie while(condition); in einer C-Programmierung? Wenn while(condition); ist gültig, was bedeutet das?

  • Ja, leider, wie ich nach ein paar verschwendeten Stunden in meinem ersten Programmierkurs feststellen musste.

    – Chance

    8. November 2010 um 22:24 Uhr

  • Die Bedingung ist irrelevant, alle werden entweder als wahr oder falsch ausgewertet. Zugegeben, Dinge können innerhalb der Bedingung getan werden, wie unten besprochen, aber diese Frage scheint sich hauptsächlich auf Syntax und/oder Verhalten in Bezug auf die Schleife zu beziehen.

    – Chance

    8. November 2010 um 22:30 Uhr

  • Ja, es ist gültig. Wie sonst würden Sie eine do-while-Schleife schreiben?

    – Endolith

    8. Februar 2012 um 15:22 Uhr

while (condition);

ist das gleiche wie

while (condition) 
{
}

Es kann für Warteschleifen verwendet werden, zB:

while (!isLightGreen()); // waits until isLightGreen() returns true
go();

  • Es sollte beachtet werden, dass dies dazu führt, dass die Ausführung ständig in einer Schleife läuft und die Bedingung überprüft, sodass der Prozess/Thread nicht wirklich wartet, sondern die ganze Zeit CPU-Zeit verwendet.

    – TeaDrivenDev

    8. November 2010 um 15:27 Uhr

  • @GCATNM: richtig, aber manchmal (z. B. Controller-Anwendungen, die auf ein Signal warten) gibt es wirklich nichts anderes zu tun, als nur zu warten. Wenn dies nicht das gewünschte Verhalten ist, sollte der Schleifenkörper Thread/Task-Wechsel zulassen (z. B. durch Schlafen) oder einen anderen Mechanismus zum Warten verwenden (z. B. Call-Back-Funktionen, Interrupts); aber das war nicht die frage…

    – Quark

    8. November 2010 um 15:37 Uhr

  • @Brian und auch fleißig warten 🙂

    – San Jacinto

    8. November 2010 um 15:42 Uhr

  • Bedingung kann auch beinhalten Aktion außerdem ist es schließlich eine willkürliche Ausdrucksauswertung. Damit das ganz Diskussion ist IMHO lächerlich. Das ganze Blabla über Prozessorlasten, Spin-Locking, Blocking, Shmocking usw.

    – Valdo

    8. November 2010 um 17:21 Uhr

  • Der Kommentar ist wahr, unabhängig davon, ob die Bedingung blockiert oder nicht. Wenn es blockiert, ist der Name schlecht gewählt und die Schleife unnötig. Wenn es nicht blockiert, ist das Beispiel schlecht gewählt – es wird am häufigsten von Anfängern als Anti-Pattern verwendet.

    – Andi Thomas

    8. November 2010 um 18:40 Uhr

Benutzer-Avatar
Andi Thomas

Das bedeutet, dass der Körper der Schleife leer ist. Normalerweise wird dieses Muster verwendet, wenn die Bedingung selbst etwas Arbeit leistet.

Diese Schleife kann beispielsweise Bytes innerhalb der Bedingung kopieren:

while ( '\0' != (*pt++ = *ps++))
            ;

Wenn Sie ein Semikolon verwenden, ist es eine gute Idee, es in eine separate Zeile zu schreiben, damit es weniger wie ein Fehler aussieht. Ich persönlich neige dazu, leere Klammern zu verwenden – {}, und manchmal einen Kommentar, dass der leere Block beabsichtigt ist.

Bearbeiten:

Im zweiten Kommentar stellt Tom Anderson eine Verbesserung gegenüber einem einsamen Semikolon fest. Googles C++-Styleguide empfiehlt entweder dies oder {}.

while ( '\0' != (*pt++ = *ps++))
            continue;

  • +1 für die Erklärung, dass es nützlich ist, wenn die Schleifenbedingung einen Nebeneffekt hat. -100000, um das Semikolon in eine separate Zeile zu setzen! Entsetzlich! FWIW, es gibt einen guten Crossposting-Flamewar auf comp.lang.java.programmer/comp.lang.c darüber, wie man dieses Konstrukt formatiert, was von Interesse sein könnte.

    – Tom Anderson

    8. November 2010 um 15:36 Uhr

  • while (condition) continue; (mit einem Zeilenumbruch vor dem Continue und/oder geschweiften Klammern, wie Sie es bevorzugen) wurde als lesbare und einigermaßen ungekünstelte Form vorgeschlagen.

    – Tom Anderson

    8. November 2010 um 15:43 Uhr

  • Wie ich bereits erwähnt habe, verwende ich geschweifte Klammern anstelle eines Semikolons. K&R hat das Semikolon in einer separaten Zeile verwendet. Das Muster “Fortfahren” scheint eine Verbesserung zu sein. Flamewars im Kleinkram halte ich nicht für wertvoll.

    – Andi Thomas

    8. November 2010 um 16:09 Uhr

  • Können wir einen weiteren Flammenkrieg wegen der umgekehrten Bedingung führen? Ich bevorzuge stark ‘while ((*pt++ = *ps++) != '\0'), aber das ist das Schöne an Flame Wars. (FWIW: Ich bevorzuge das Semikolon allein in der nächsten Zeile.)

    – Jonathan Leffler

    8. November 2010 um 17:53 Uhr

  • Ich dachte daran, ein ähnliches Beispiel hinzuzufügen, aber vielleicht mit einem anderen Stil. Abgesehen vom Stil ist dies ein gutes Beispiel für die übliche Verwendung eines leeren „while“-Körpers.

    – Lee-Man

    8. November 2010 um 18:03 Uhr

Ja, du kannst. Es bedeutet nur, dass die While-Schleife weiterschleift, bis condition ist falsch. Zum Beispiel:

#include<stdio.h>

int x = 10;
int func()
{
  printf("%d\n", x);
  return --x;
}

int main()
{
  while(func());
  return 0;
}

Aber im Allgemeinen tun dies die Leute nicht, da es sinnvoller wäre, die Logik in den Körper der Schleife zu stecken.

Bearbeiten:

Es gibt einige Beispiele dafür, z. B. das Kopieren einer nullterminierten Zeichenfolge:

char dest[256];
char *src = "https://stackoverflow.com/questions/4125124/abcdefghijklmnopqrstuvwxyz";
while(*(dest++) = *(src++));

  • Während dies ein Beispiel für eine leere Body-Schleife sein kann, ist es auch ein Beispiel für schlecht gestalteten Code (daher meiner Meinung nach etwas weniger nützlich).

    – Lee-Man

    8. November 2010 um 18:04 Uhr

  • @Lee-Man – genau, ich weise sogar darauf hin, dass es keine gute Idee ist, die Logik gehört in den Körper der Schleife. Mein zweites Beispiel ist ein wenig besser, schon allein deshalb, weil es ein ziemlich verbreitetes Muster ist und die meisten C-Programmierer es sofort erkennen würden.

    – Niki Yoshiuchi

    8. November 2010 um 18:07 Uhr

Benutzer-Avatar
Blagovest Buyukliev

Da die Erkrankung tatsächlich Nebenwirkungen haben kann, ist ein solches Konstrukt erlaubt. Folgendes berücksichtigen:

while (*p && *p++ != ' ');

Dies würde die vorantreiben p Zeiger auf das erste Zeichen, das ein Leerzeichen ist.

Sie können sogar den Kommaoperator verwenden, um gewöhnliche Anweisungen innerhalb der Bedingung zu haben:

while (do_something(), do_something_else(), i < n);

Weil Anweisungen, die mit dem Komma-Operator verbunden sind, in diesem Fall als die Anweisung ganz rechts ausgewertet werden i < ndas obige ist identisch mit:

do {
  do_something();
  do_something_else();
} while (i < n);

Die Bedingung wird so lange ausgewertet, bis sie falsch ist. Es ist eine Schleife ohne Körper.

Programmierer fügen oft ein Leerzeichen vor dem Semikolon ein, dh

while(condition) ;

oder leere Klammern:

while(condition) {}

den leeren Körper zu zeigen ist beabsichtigt und nicht nur ein Tippfehler. Wenn Sie bestehenden Quellcode lesen und sich fragen, warum dort eine leere Schleife ist, sollten Sie auch die nächsten paar Zeilen lesen, um zu sehen, ob das Semikolon wirklich dort sein sollte oder nicht (dh sehen die nächsten paar Zeilen wie der Körper einer Schleife oder nicht?).

Benutzer-Avatar
eine Masse

Ja das ist richtig. Es wird die Bedingung wiederholen, bis sie falsch ist.

while ( condition() );

Benutzer-Avatar
Darron

Ich schreibe das immer so:

while (condition())
    continue;

Damit klar ist, dass es kein Fehler war. Wie andere gesagt haben, macht es nur Sinn, wenn condition() Nebenwirkungen hat.

  • Bedingung ohne Seiteneffekte macht auch Sinn, wenn sie flüchtige Variablen prüft, wenn sie nur auf asynchrone Ereignisse wartet.

    – Vovanium

    8. November 2010 um 23:09 Uhr

1370070cookie-checkIst der Code “while(condition);” gültig und was bedeutet das?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy