2012-02-24 12 views
5

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”?

+8

[Nic] (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight

+0

Zadania domowe wymagają znacznika pracy domowej. –

+2

@Robert: Nie sądzę, by ktokolwiek pytał o to w swojej pracy domowej ... – Bruce

Odpowiedz

11

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.

+0

Albo, jeszcze lepiej, wyszukiwania SO. – smparkes

+2

@Bruce: zobacz wersję roboczą ANSI C http://flash-gordon.me.uk/ansi.c.txt, załącznik A.2 – Christoph

+0

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

3

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.