2016-12-26 57 views
1
a = 5; 
c = (b =a+2) - (a=1); 

在書c編程的一個現代方法由kn king寫道執行第二個語句的效果將導致6或2,因爲它是c的未定義行爲,但在其他書c由Dennis寫出它將從左到右執行。哪一個是正確的?C語言的優先順序

+3

這是未定義的行爲。 – BLUEPIXY

+2

什麼是「丹尼斯的C」?如果你在談論[K&R](https://en.wikipedia.org/wiki/The_C_Programming_Language),它沒有提到任何關於從左到右的執行。 – user2357112

+2

你確定國王這麼說嗎?哪個版本和頁碼? –

回答

2

在上述情況下,

c=(b=a+2) -(a=1); 

a的值被更改時,沒有在之間的序列點被讀取,所以它是undefined behavior

引用C11,附件§J.2,未定義行爲

標量對象上的副作用是相對於任一相同的標量對象上的不同的副作用 或值計算未測序使用該對象的標量爲 的值。

另外相關的,由第§6.5

符和操作數的分組是由語法表示。 85)除了後面指定的 以外,子表達式的副作用和值計算是不確定的。 86)

因此,不能保證哪個子表達式將首先得到評估。

+0

關閉,但評估不(必然)同時進行。 –

+0

@凱瑟湯普森先生,這就是爲什麼我把它放在_italics_中,你能提出一個替代措辭嗎? –

+0

放下「同時」一詞,只是說沒有順序點。 –