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?
|
Forum: Compiler & IDEs Zuweisung in while-BedingungHallo, wie wird folgender Ausdruck ausgewertet:
Wird die while-Schleife solange ausgeführt, bis test=0 ist, oder müßte man in diesem Fall
schreiben? Alois wrote: > Hallo, > > wie wird folgender Ausdruck ausgewertet: > >
> 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 > >
> > schreiben? Nein. Ist absolut equivalent. Alois wrote: > Und was ist mit: > >
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 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.
ich würde in beiden Fällen klammern und einen expliziten Vergleich hinschreiben: Bei
wird jeder erstmal einen Fehler vermuten. Auch ein automatisches Fehlererkennungstool wird hier eine Warnung ausgeben. Bei
ist dagegen sofort klar, dass das "=" kein fehlerhaftes "==" darstellt. Gruß, Stefan 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:
(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.
|
|