Jeśli mam następujące wyrażenie:Zamówienie oceny ekspresji w C
c = (a) * (b)
Co średnia C90 powiedzenia na temat oceny zlecenia z podwyrażenie „a” i „b”?
Jeśli mam następujące wyrażenie:Zamówienie oceny ekspresji w C
c = (a) * (b)
Co średnia C90 powiedzenia na temat oceny zlecenia z podwyrażenie „a” i „b”?
Nie ma określonej kolejności, ponieważ operator mnożenia nie jest punktem sekwencji. Punkty sekwencyjne obejmują operator przecinka, koniec pełnego wyrażenia i wywołania funkcji. Tak więc kolejność oceny (a)
i (b)
zależy od implementacji kompilatora. Dlatego nie powinieneś próbować robić czegoś w (a)
, który miałby efekt uboczny, który chcesz zobaczyć w (b)
w celu wygenerowania prawidłowego wyniku.
Na przykład:
int a=5;
int b = (a++) * (a++); //<== Don't do this!!
Jeśli chcesz pełnej listę punktów sekwencja C, można sprawdzić na more thorough reference here.
Albo, jeszcze lepiej, wyszukiwania SO. – smparkes
@Bruce: zobacz wersję roboczą ANSI C http://flash-gordon.me.uk/ansi.c.txt, załącznik A.2 – Christoph
Twój przykład rzeczywiście pokazuje nieprawidłowy kod, ale nie z powodu zlecenia oceny. Oczywiście nie ma znaczenia, które "a ++" zostanie ocenione jako pierwsze. – ugoren
Kolejność oceny operandów operatora binarnego *
jest nieokreślona w C90.
Oto odnośny ustęp od standardu C90 (jak na pytanie o C90):
(C90, 6,3) „, z wyjątkiem wskazań przez składni lub w inny sposób określony później (dla funkcji-call operator(), & &, ||,:., a operatorzy przecinek) kolejności oceny podwyrażeń i kolejność, w której odbywają się skutki uboczne są zarówno unspecitied”
Dla operatora *
, gdybyśmy weź przykład z operandami efektu ubocznego, takimi jak:
c = f() * g();
realizacja może wywołać f()
pierwszy lub g()
pierwsze:
a = f();
b = g();
c = a * b;
lub
a = g();
b = f();
c = a * b;
Obie są poprawne tłumaczenia.
[Nic] (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight
Zadania domowe wymagają znacznika pracy domowej. –
@Robert: Nie sądzę, by ktokolwiek pytał o to w swojej pracy domowej ... – Bruce