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...
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?!
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
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
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:
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.