2009-11-16 58 views
0

我下J.1不確定的行爲看着SO/IEC 9899:201x子表達式計算順序

"The order in which subexpressions are evaluated and the order in which side effects 
take place, except as specified for the function-call(), &&, ||, ?:, and comma 
operators (6.5)." 

這是否意味着,在

func1() + func2(); 

FUNC2()可以被FUNC1()之前預先形成,或即使在func1()期間?

回答

4

在當前的標準(ISO/IEC 9899:1999)有函數調用,但評價的順序之間的順序點沒有指定操作數爲+,因此可以在func2之前或之後調用func1,但函數調用不得以任何方式重疊或交錯。

這意味着如果需要,func1func2中的每一個都可以與某些共享數據進行交互,而不會以意外的方式在其下面更改數據。

+1

是的,加號運算符是一個序列點,請參閱http://en.wikipedia.org/wiki/Sequence_point – 2009-11-16 23:27:28

+0

在目前的標準:6.5/10,我相信。 – 2009-11-16 23:29:27

+1

加號運算符本身並不意味着一個序列點,但是因爲它的參數都是函數調用,所以在求值之前有兩個序列點。 – 2009-11-16 23:31:05

1

不期間,但是肯定的是,無論是1,則2或2然後1.

+0

謝謝,爲什麼不在期間? – 2009-11-16 23:20:27

+0

被調用函數的內容本身不是子表達式:) – 2009-11-16 23:25:32

+1

@Liran:參見** 6.5.2.2函數調用**/10和註釋84)'換句話說,函數執行不會' 'interleave''互相'。' – pmg 2009-11-16 23:35:16