我不知道這是編譯器特定的,但是當我試圖在DEVC++i = i ++ + ++ c的輸出差異;和i = ++ i + C++;
運行兩個表達式當i=c=b=0;
i=i++ + ++c
給2
而i=++i + c++
給1
但 b=i++ + ++c
和 b=++i + ++c
產生的結果兩個表達式都使用了1
。
我知道,在同一個表達式中增加一個變量兩次會導致一個未定義的值,但是我很好奇編譯器是如何產生這些輸出的。有人可以解釋如何和爲什麼?
我不知道這是編譯器特定的,但是當我試圖在DEVC++i = i ++ + ++ c的輸出差異;和i = ++ i + C++;
運行兩個表達式當i=c=b=0;
i=i++ + ++c
給2
而i=++i + c++
給1
但 b=i++ + ++c
和 b=++i + ++c
產生的結果兩個表達式都使用了1
。
我知道,在同一個表達式中增加一個變量兩次會導致一個未定義的值,但是我很好奇編譯器是如何產生這些輸出的。有人可以解釋如何和爲什麼?
i++
和++i
是完全不同的,是i++
後增量,這意味着評價表達i
然後遞增一次其評價。 ++i
意味着增量然後評估表達式。 我在你的例子中看到你設置了i = ++i/i++
,這是未定義的行爲,如評論中提到的。
i++ + ++c
,所述c
遞增(),然後0 + 1
存儲在i
,最後i
遞增,給予2
。
++i + c++
,所述i
遞增(),然後1 + 0
存儲在i
,然後c
遞增。
這就是我如何理解編譯器做了什麼,但正如其他人所說的那樣,別指望這種行爲。
你確定b = ++ i ++ ++ c = 1嗎?或者它是b = ++ i + C++?這是我對你的問題的解釋。
i = i++ + ++c
(i = 0 + 1)++
i = 2
c = 1
i = ++i + c++
(i = 1 + 0)
i = 1
c = 1
C99標準明確地說(6.5,P2)
之前和下一序列點之間的對象應具有其存儲的值在由表達式的評估改性最多一次。
表達式i = ++i;
和i = i++;
都更新i
兩次,這是不允許的。
未定義的行爲。 [惡魔可能會飛出你的鼻子](http://www.urbandictionary.com/define.php?term=nasal%20demons)。實際上,如果你沒有把結果返回給導致未定義行爲的「i」,這個問題會很有趣。 –
@Fred拉爾森在第二個例子中,他不是有效的,但第一個是未定義的,正如你所提到的 –
@Jesus:我在這兩個中看到賦值爲'i',所以都是未定義的行爲。賦值和增量之間沒有順序點。 –