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
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.
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"?
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...
Das ist eine wohl unbeabsichtigte leere Anweisung. Sollte keine Auswirkungen haben. Kategorie: Tippfehler. MfG Irgend Einer
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...
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...
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?!
Lothar Miller schrieb: > Es sind Semikolon. <Pedanterie> Es sind Semikola, das ist der Plural von Semikolon. </Pedanterie>
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
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 | ;
|
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.
> 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.
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 ;-)
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
Lothar Miller schrieb: >> geupdated > upgedated? > gedateupped? > Oder einfach nur "aktualisiert"? Schlimmer: "aufdatiert".
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 | }
|
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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.