Forum: Compiler & IDEs c-code: while


von simon (Gast)


Lesenswert?

hallo, kann es folgenden code als funktionierenden programmteil in der 
software geben?

...
while (tasterdruck == 1);;
...


die variable tasterdruck wird vorher ausgewertet und das ganze soll 
stehen bleiben, solange der taster gedrückt ist.. irritieren tuen mich 
aber die zwei simikolon

gruß simsen

von Dr. Sommer (Gast)


Lesenswert?

simon schrieb:
> hallo, kann es folgenden code als funktionierenden programmteil in
> der
> software geben?
Ja. Ob es funktioniert hängt davon ab ob "tasterdruck" volatile ist und 
auch entsprechend geupdated wird.

Das zweite Semikolon hat keinerlei Wirkung und kann weg gelassen werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

simon schrieb:
> irritieren tuen mich aber die zwei simikolon
Es sind Semikolon.
Ja, da ist einer zuviel. Aber der stört nicht. Es ist einfach nur 
schlampig...

> die variable tasterdruck wird vorher ausgewertet und das ganze soll
> stehen bleiben, solange der taster gedrückt ist..
Hier geht es nur weiter, wenn sich die Variable anderswo, z.B. in einer 
ISR ändert. Sonst bleibt der uC ewig+3 Tage an dieser Stelle stehen...

Dr. Sommer schrieb:
> geupdated
upgedated?
gedateupped?
Oder einfach nur "aktualisiert"?

von simon (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Das zweite Semikolon hat keinerlei Wirkung und kann weg gelassen werden.

danke für das !!sehr!! schnelle feedback :)
für was wird das dann aber verwendet? ich lese das oft bei 
informatikern?!
einen fehler beim kompilieren oder gar eine warnung erhalte ich aber 
auch nicht...

von einer (Gast)


Lesenswert?

Das ist eine wohl unbeabsichtigte leere Anweisung.
Sollte keine Auswirkungen haben.
Kategorie: Tippfehler.

MfG
Irgend Einer

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

simon schrieb:
> für was wird das dann aber verwendet?
Was?

> ich lese das oft bei informatikern?!
Was? Die doppelten Strichpunkte? Da gibt es noch den Fall der 
forever-Schleife:
1
  for (;;);
Dazu solltest du aber einfch mal den for-Befehl genauer ansehen...

> einen fehler beim kompilieren oder gar eine warnung erhalte ich aber
> auch nicht...
Nein, warum auch? Das ist ja nur eine "leere" Programmzeile...

von Dr. Sommer (Gast)


Lesenswert?

simon schrieb:
> )
> für was wird das dann aber verwendet? ich lese das oft bei
> informatikern?!
Hä? Das wird höchstens aus Unwissenheit über die Programmiersprache (bei 
Informatikern leider nicht ungewöhnlich) verwendet. Das ist vollkommen 
sinnfrei. Außer bei "for":
1
for(;;) { }
Ist eine Endlosschleife.

simon schrieb:
> einen fehler beim kompilieren oder gar eine warnung erhalte ich aber
> auch nicht...
Ist auch kein Fehler. Ein Semikolon ohne was davor (außerdem vorherigen 
Semikolon) ist einfach eine leere Anweisung. Eine leere Anweisung macht 
nix und ist nicht falsch...

von simon (Gast)


Lesenswert?

ja.. die frage bezieht sich auf das doppelte simikolon..
kann das echt zufall sein, dass mir das schon dreimal genau hinter einer 
while-schleife ohne körper untergekommen ist?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Es sind Semikolon.

<Pedanterie>
Es sind Semikola, das ist der Plural von Semikolon.
</Pedanterie>

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

simon schrieb:
> simikolon
Lothar Miller schrieb:
> Es sind Semikolon.
Wenn schon "Fachbegriffe", dann doch gleich richtig...

Rufus Τ. Firefly schrieb:
> <Pedanterie>
> Es sind Semikola, das ist der Plural von Semikolon.
> </Pedanterie>
Soweit wollte ich nicht gehen... ;-)

Wobei Semikolons auch ginge... ;-)
http://de.wikipedia.org/wiki/Semikolon

von Karl H. (kbuchegg)


Lesenswert?

Auch wenn viele das nicht wissen: In C gibt es die sog. "leere 
Anweisung". Also eine Anweisung, die nichts tut und nur aus einem 
Semikolon besteht.

genau das wird ja auch hier benutzt
1
  while( irgendwas )
2
    ;

das Semikolon gehört ja nicht zu while. Die Syntax eines while ist ja, 
dass es eine abhängige Anweisung geben muss. Diese Anweisung ist es, die 
normalerweise mit einem ; abgeschlossen wird. Ein while hat ja selbst 
keinen Semikolon als Abschluss.
So wie in
1
  while( irgendwas )
2
    i = 5;

Hier ist es dann eben die leere Anweisung, die als abhängige Anweisung 
im Körper des while steht
1
  while( irgendwas )
2
    ;

und natürlich kann man auch noch eine 2-te leere Anweisung danach 
einbauen, die ebenfalls nichts tut
1
  while( irgendwas )
2
    ;
3
4
  ;

von simon (Gast)


Lesenswert?

jedenfalls dankeschön ;)

\\closed

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

>
1
>   while( irgendwas )
2
>     ;
3
>

und ja. Ich bevorzuge genau diese Schreibweise und nicht die Form, in 
der das Semikolon in derselben Zeile wie das while steht.
Denn syntaktisch gehört erstens das Semikolon nicht zum while sondern 
ist eine eigene Anweisung (wenn auch eine leere Anweisung).
Und zweitens schreib ich ja auch nicht
1
  while( irgendwas ) i = 5;
sondern schreibe das formal in 2 Zeilen um die abhängige Anweisung aus 3 
Meter Entfernung sehen zu können.
1
  while( irgendwas )
2
    i = 5;

Warum soll ich daher bei einer leeren Anweisung das Formatierschema über 
Bord werfen? Anstatt einer Zuweisungs-Anweisung steht dort eben die 
leere Anweisung. Aber das ändert ja nichts am Schema
1
   while( irgendwas )   // <- das hier ist eine 'Anweisung'
2
     ;                  // <- und das hier ist auch eine Anweisung

ganz im Gegenteil finde ich den Semikolon in derselben Zeile gefährlich, 
weil man ihn leicht übersieht.

von Karl H. (kbuchegg)


Lesenswert?

> kann das echt zufall sein, dass mir das schon dreimal genau hinter
> einer while-schleife ohne körper untergekommen ist?!

Du missverstehst das (und wie Dr. Sommer bereits sagte: es ist nicht 
ungewöhnlich, dass Informatiker über ihre Programmiersprache nicht 
Bescheid wissen)

Die while Schleife HAT einen Körper. Einen while Schleife hat IMMER 
einen Körper, der im einfachsten Fall aus einer Anweisung besteht. Und 
wenn das die leere Anweisung ist. Der Semikolon hat syntaktisch NICHTS 
mit dem while zu tun!

Die Syntax eines while ist (ein wenig vereinfacht dargestellt um den 
wesentlichen Punkt zu zeigen)
1
  while( Ausdruck )
2
    Anweisung

es ist der Teil 'Anweisung', der den Semikolon einbringt. Das while 
selbst verlangt keinen. Bau da eine Anweisung rein, die keinen Semikolon 
als Abschluss hat, dann steht da auch kein Semikolon.

Genau aus dem Grund tauchen ja auch in
1
  while( irgendwas )
2
    while( irgendwas_anderes )
3
      i = 5;

keine 2 Semikolons auf! Der Semikolon gehört nicht zum while, sondern zu 
der Zuweisung.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Karl Heinz schrieb:
> ganz im Gegenteil finde ich den Semikolon in derselben Zeile gefährlich,
> weil man ihn leicht übersieht.

Und wenn man noch ein zweites Semikolon anfügt, übersieht man es noch
weniger. Vielleicht ist das der Grund für das Doppelsemikolon im
ursprünglichen Code ;-)

von Kaj (Gast)


Lesenswert?

Lothar Miller schrieb:
> Dr. Sommer schrieb:
>> geupdated
> upgedated?
> gedateupped?
> Oder einfach nur "aktualisiert"?
Oder so wie Maxis das bei  Sim City ne zeitlang drin hatte... da wurde 
bei der übersetzung aus "update" dann ein "abdate" :D

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>> geupdated
> upgedated?
> gedateupped?
> Oder einfach nur "aktualisiert"?

Schlimmer:

"aufdatiert".

von Hans (Gast)


Lesenswert?

Am leserlichsten finde ich immer noch einen leeren Block, idealerweise 
mit einem Kommentar, was in der Schleife passiert:
1
while (irgendwas)
2
{
3
  // Warte, bis nicht mehr irgendwas
4
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hans schrieb:
> Am leserlichsten finde ich immer noch einen leeren Block, idealerweise
> mit einem Kommentar, was in der Schleife passiert:
>
>
1
while (irgendwas)
2
> {
3
>   // Warte, bis nicht mehr irgendwas
4
> }

Genau, hier sieht auch ein unbedarfter Leser direkt, dass das leere 
Statement voll und ganz beabsichtigt und nicht etwa ein Tippfehler ist.

Ich selber gehe sogar noch ein wenig weiter und schreibe noch das 
Semikolon in den Block:
1
while (irgendwas)
2
{
3
  ;                  // Warte, bis nicht mehr irgendwas
4
}

Aber es ist Geschmackssache. Es gibt Leute, denen es vollkommen reicht, 
wenn sie ihren eigenen Code noch lesen können ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Anzumerken sei noch, daß es natürlich auch eine Variante von while 
gibt, bei der hinter der Klammer mit dem Ausdruck nichts anderes als ein 
Semikolon kommen kann -- nämlich wenn mit do - while gearbeitet 
wird.

Ist man auf die einzelne Codezeile fixiert, ist das ja nicht unbedingt 
zu erkennen:

1
do
2
{
3
  // viele, viele Zeilen
4
  //
5
  // noch mehr Zeilen
6
}
7
8
while (ausdruck);


Mit der (von mir zufällig eingestreuten Leerzeile) wird das natürlich 
noch forciert ...

Klar, daß man das durch eine etwas andere Quelltextformatierung 
deutlicher erkennbar machen kann, aber ... inhaltlich ist das hier halt 
exakt dasselbe:

1
do
2
{
3
  // viele, viele Zeilen
4
  //
5
  // noch mehr Zeilen
6
} while (ausdruck);

Und in ersterem Falle könnte jetzt jemand, der aufgrund der vielen 
Zeilen das einleitende do aus den Augen verloren hat, auf die Idee 
kommen, das hier daraus zu machen:

1
do
2
{
3
  // viele, viele Zeilen
4
  //
5
  // noch mehr Zeilen
6
}
7
8
while (ausdruck)
9
{ };

Und dann nölt der Compiler.

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.