Forum: Compiler & IDEs frage zur if-anweisung mit while


von ahnungsloser (Gast)


Lesenswert?

Hallo,

folgenden Code habe ich gesehen:

if (pointer == NULL) while(1)

heißt für mich wenn die if-Bedindung erfüllt ist, gehe in eine 
Endlosschleife. Oder sehe ich da was falsch?

von Karl H. (kbuchegg)


Lesenswert?

ahnungsloser schrieb:
> Hallo,
>
> folgenden Code habe ich gesehen:
>
> if (pointer == NULL) while(1)
>
> heißt für mich wenn die if-Bedindung erfüllt ist, gehe in eine
> Endlosschleife. Oder sehe ich da was falsch?

Das kommt drauf an, ob dahinter noch ein ; kommt oder nicht.

von ahnungsloser (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Das kommt drauf an, ob dahinter noch ein ; kommt oder nicht.

Ja, da ist ein ;

also so siehts aus

if (pointer == NULL) while(1);

von Karl H. (kbuchegg)


Lesenswert?

Dann wird eine Endlosschleife angefangen, sobald die Prüfung der 
Variablen Pointer auf NULL den Wert true ergibt.

Korrekt.

Vielleicht bereitet dir das weniger Kopfzerbrechen, wenn man das etwas 
besser formatiert
1
  if( pointer == NULL )
2
  {
3
    while( 1 )
4
      ;
5
  }

von Grrrr (Gast)


Lesenswert?

Genau genommen kann man das aus diesem Codeschnipsel nicht ableiten.

while(1) leitet zwar typischerweise eine Endlosschleife ein; sie kann 
aber durch ein break im Schleifenkörper wieder eine abbrechende Schleife 
werden.

Zeig mal das komplette, von If abhängige Statement bzw. 
Compound-Statement.
Also entweder bis zum folgenden Semikolon oder bis zur nächsten 
äußersten schliessenden geschweiften Klammer.

von ahnungsloser (Gast)


Lesenswert?

Grrrr schrieb:
> Zeig mal das komplette, von If abhängige Statement

danach gehts dann normal weiter. Die {}klammern von while(1) gibt es 
nicht

von Hc Z. (mizch)


Lesenswert?

Grrrr schrieb:
> while(1) leitet zwar typischerweise eine Endlosschleife ein; sie kann
> aber durch ein break im Schleifenkörper wieder eine abbrechende Schleife
> werden.

Der Schleifenkörper ist aber genau und vollständig dargelegt: er besteht 
aus nichts außer einem abschließenden „;“.  Daraus wird keine 
abbrechende Schleife mehr.

von Oliver (Gast)


Lesenswert?

ahnungsloser schrieb:
> also so siehts aus
>
> if (pointer == NULL) while(1);
Da wird vermutlich ein Totalabsturz durch den Nullpointer abgefangen, 
indem dem Benutzer ein Totalabsturz durch eine Endlosschleife 
vorgegauckelt wird ;-)

Sinnvoll ist sowas nur auf Multitasking/Multithreading-Betriesystemen, 
bei denen ein andere Task/Thread den hängenden abschiessen kann.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

ahnungsloser schrieb:
> Grrrr schrieb:
>> Zeig mal das komplette, von If abhängige Statement
>
> danach gehts dann normal weiter. Die {}klammern von while(1) gibt es
> nicht

Irrtum, weder ; noch { } gehören zum while. (Na ja, bei den { } kann man 
streiten)

while, if, for sind Compound Statements.
d.h. sie bestehen aus dem while, if, for und einer davon abhängigen 
Anweisung. In

   while( 1 )
     ;

bildet der ; die Anweisung, eine leere Anweisung.

Will man mehrere Anweisungen innerhalb des abhängigen Teils haben, so 
muss man diese mehreren Anweisungen in { } einschliessen. Diese Klammern 
fungieren dann als Blockbildner, die syntaktisch aus den mehreren 
Anweisungen wieder eine Anweisung, den Block, machen. Auch bei

  while( 1 )
  {
    tu_was;
    tu_noch_was;
  }

steuert das while nur die Ausführung einer Anweisung. Nur ist diese 1 
Anweisung die Sequenz von Anweisungen, die in einem { } zusammengefasst 
wurde.

Aber syntaktisch sieht while so aus

   while( Expression )
     Statement

ohne ';', ohne { }

von Hc Z. (mizch)


Lesenswert?

Oliver schrieb:
> Sinnvoll ist sowas nur auf Multitasking/Multithreading-Betriesystemen,
> bei denen ein andere Task/Thread den hängenden abschiessen kann.

Oder um den Watchdog zu triggern.

von Karl H. (kbuchegg)


Lesenswert?

Oder um eine Stelle zu haben, an der man im Debugger einen Breakpoint 
platzieren kann :-)

von Klaus W. (mfgkw)


Lesenswert?

.. oder weil dem Programmierer für diesen Fall nichts besseres 
eingefallen ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.