Gast
#595812
Hallo, wie wird folgender Ausdruck ausgewertet:
1 | |
Wird die while-Schleife solange ausgeführt, bis test=0 ist, oder müßte man in diesem Fall
1 | |
2 | |
3 | |
schreiben?
|
Anzeige
|
Zuweisung in while-Bedingung
Gast
#595812
Hallo, 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. ;) ja Gruß Hagen Gehupst wie gesprungen.
Gast
#595841
Und was ist mit:
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
Gast
#595871
Läßt sich da mit Klammern was machen? 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
Gast
#599419
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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|