簡體   English   中英

C中的表達式評估順序

[英]Order of expression evaluation in C

如果我有以下表達式:

c = (a) * (b)

C90標准對子表達式'a'和'b'的順序評估有什么看法?

由於乘法運算符不是序列點,因此沒有指定的順序。 序列點包括逗號運算符,完整表達式的結束和函數調用。 因此, (a)(b)的評估順序取決於編譯器實現。 因此,您不應該嘗試在(a)中做一些有希望在(b)中看到的副作用以生成有效結果的事情。

例如:

int a=5;
int b = (a++) * (a++); //<== Don't do this!!

如果您想要C的序列點的完整列表,可以在這里查看更全面的參考

在C90中未指定*二元運算符的操作數的評估順序。

以下是C90標准的相關段落(關於C90的問題):

(C90,6.3)“除非語法指示或稍后指定(對於函數調用運算符(),&&,||,?:和逗號運算符)。子表達式的計算順序和順序發生的副作用都是未指明的“

對於*運算符,如果我們以副作用操作數為例:

c =  f() * g();

實現可以先調用f() first或g()調用:

a = f();
b = g();
c = a * b;

要么

a = g();
b = f();
c = a * b;

兩者都是有效的翻譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM