PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : a=b=c ?



nobody0
16-10-2002, 09:19
In einem C-Programm habe ich in einer Zeile

a=b=c;

Bedeutet dies dasselbe wie

b=c;
a=c;

oder ist das u. A. vom Compiler abhängig, weil beim "=" nicht definiert ist in welcher Reihenfolge bewertet wird? :confused:

anda_skoa
16-10-2002, 09:31
Original geschrieben von nobody0
a=b=c;

Bedeutet dies dasselbe wie

b=c;
a=c;


Ja.
Genau genommen das selbe wie
b = c;
a = b;

In C sind häufig Ausrücke, die in anderen Sprachen nur "Statements" sind in Wirklichkeit "Expressions", d.h. sie haben ein Resultat.
Bei = ist es der Wert der rechten Seite.

Darum sieht man in C Code manchmal solche Konstrukte


while ( (c=getch()) != 0)


Also eine Zuweisung und ein anschließender Vergleich.

Ciao,
_

nobody0
16-10-2002, 09:41
Aha, ohne Klammern empfand ich es als zweideutig, weil ja einmal

a=b;
b=c;

und einmal (bei umgekehrter Reihenfolge der Auswertung)

a=c;
b=c;

möglich ist.

Jedenfalls habe ich nun
a=c;
b=c;
geschrieben um es eindeutig zu machen; mal sehen ob der Code so wie bisher ausgeführt wird.

anda_skoa
16-10-2002, 10:41
Original geschrieben von nobody0
Aha, ohne Klammern empfand ich es als zweideutig, weil ja einmal

a=b;
b=c;

und einmal (bei umgekehrter Reihenfolge der Auswertung)


Ich denke ein Assigment wird immer von rechts nach links ausgewertet :)



Jedenfalls habe ich nun
a=c;
b=c;
geschrieben um es eindeutig zu machen; mal sehen ob der Code so wie bisher ausgeführt wird.


Tut es sicher, das ist equivalent.
Aber so ist es auch meiner Meining nach schöner.
Außerdem kann man leichter eine der beiden Zuweisungen ändern, ohne dass man aufpassen muß.

Ciao,
_

nobody0
16-10-2002, 12:38
Original geschrieben von anda_skoa
Ich denke ein Assigment wird immer von rechts nach links ausgewertet :)


Ja, aber nun ob das linke oder das rechte Assigment zuerst ausgewertet wird ist entscheident dafür ob die obige erste oder die zweite Variante durchgeführt wird.
Und wenn, wie man es von boolschen Ausdrücken kennt, von links nach rechts ausgewertet wird, dann ist es nämlich genau die andere, also

a=b;
b=c;

Deshalb muss ich noch überprüfen, ob das Programm weiterhin sinnvoll abläuft.

anda_skoa
16-10-2002, 14:36
Original geschrieben von nobody0
Ja, aber nun ob das linke oder das rechte Assigment zuerst ausgewertet wird ist entscheident dafür ob die obige erste oder die zweite Variante durchgeführt wird.


Da hast du mich falsch verstanden.
Der Parser wird den Codebaum bei so etwas immer gleich aufbauen.
Das ist nicht wie bei boolschen Ausrücken, wo ansich die Reihenfolge keine Rolle spielt, weil die boolschen Operatoren kommutativ sind.

Außerdem dürfte das so festgelegt sein.

Eben so, wie praktisch jeder Compiler boolsche Ausdrücke nur so weit auswertet wie er muß, auch wenn er laut C Standard auch alle auswerten dürfte.

Ciao,
_