Forum: Compiler & IDEs Zuweisung in while-Bedingung


von Alois (Gast)


Lesenswert?

Hallo,

wie wird folgender Ausdruck ausgewertet:
1
while (test=GetUartChar())

Wird die while-Schleife solange ausgeführt, bis test=0 ist, oder müßte 
man in diesem Fall
1
do
2
   test=GetUartChar();
3
while (test);

schreiben?

von Karl H. (kbuchegg)


Lesenswert?

Alois wrote:
> Hallo,
>
> wie wird folgender Ausdruck ausgewertet:
>
>
1
> while (test=GetUartChar())
2
>
>

So wie jede andere Zuweisung auch.
Eine Zuweisung hat als Ergebnis den Wert der zugewiesen wurde.
Dies ermöglicht Dinge wie
   a = b = c = 5;

d.h. die Zuweisung wird ausgeführt und danach der an test
zugewiesene Wert geholt und, da es sich um eine logische
Abfrage handelt, wie jeder andere numerische Wert behandelt:
0 ist logisch falsch
alles ungleich 0 wird als logisch wahr behandelt.


> Wird die while-Schleife solange ausgeführt, bis test=0 ist

Yep

>, oder müßte
> man in diesem Fall
>
>
1
> do
2
>    test=GetUartChar();
3
> while (test);
4
>
>
> schreiben?

Nein. Ist absolut equivalent.

von Hagen R. (hagen)


Lesenswert?

;) ja

Gruß Hagen

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Gehupst wie gesprungen.

von Alois (Gast)


Lesenswert?

Und was ist mit:
1
while(test=GetUartChar() != '\0')

von Karl H. (kbuchegg)


Lesenswert?

Alois wrote:
> Und was ist mit:
>
>
1
> while(test=GetUartChar() != '\0')
2
>

Das ist gemein :-)
Denn das macht nicht das was du denkst. (*)

Das Problem:
Der Vergleich hat eine höhere Operatoren Priorität
als die Zuweisung. Der Compiler sieht das also als:

  test = ( GetUartChar() != '\0' )

Das Ergebnis von GetUartChar() wird mit '\0' verglichen.
Ist es ein '\0' Zeichen, dann wird test zu 1, ansonsten
(und das dürfte meistens der Fall sein), zu 0.

da damit aber eine 0 zugewiesen wurde, ist auch das
Ergebnis des kompletten Ausdrucks

  test = ( GetUartChar() != '\0' )

gleich 0 und damit hast du

  while( 0 )

und so eine while Schleife bricht dann sofort ab (weil 0
ja logisch falsch darstellt)

(*) das entnehme ich der Art wie du die Leerzeichen gesetzt hast

von Alois (Gast)


Lesenswert?

Läßt sich da mit Klammern was machen?

von Karl H. (kbuchegg)


Lesenswert?

Natürlich.
Mit Klammern lässt sich immer was machen, wenn die 'natürliche'
Operatorenreihenfolge nicht stimmt. Du musst dich von der
Vorstellung lösen, dass in C eine Zuweisung etwas spezielles
ist. Eine Zuweisung ist auch nur eine Operation wie Addition
oder Division, die ein Eregbnis liefert. OK, als Nebeneffekt
wird in der linken Seite der Zuweisung etwas gespeichert, aber
prinzipiell ist eine Zuweisung auch nur ein arithmetischer Ausdruck
der ein Ergebnis liefert.
1
  while( ( test = GetUartChar() ) != '\0' )



von Stefan K. (_sk_)


Lesenswert?

ich würde in beiden Fällen klammern und einen expliziten Vergleich 
hinschreiben:

Bei
1
  while (test=GetUartChar())

wird jeder erstmal einen Fehler vermuten. Auch ein automatisches 
Fehlererkennungstool wird hier eine Warnung ausgeben.
Bei
1
  while ( (test=GetUartChar()) != 0 )

ist dagegen sofort klar, dass das "=" kein fehlerhaftes "==" darstellt.


Gruß, Stefan

von FBI (Gast)


Lesenswert?

Hi,

dazu brauchts nicht mal ein "automatisches Fehlererkennungstool", da 
reicht schon der GCC. Normalerweise schmeißt der bei der ersten Variante 
wenigstens eine Warnung und will entweder die zweite Variante oder 
sowas:
1
while((test=GetUartChar()))
(man beachte die zusätzliche Klammern)

CU

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.