[英]How is this expression involving post- increment operator evaluated?
main()
{
int x = 0;
int y;
y = (x++, x++);
printf("%d", y);
}
由於優先級,
操作者是R到L,I預計O / P為0,但在編譯的代碼被賦予O / P為1。
你有一個逗號運算符,所以這個定義相當合理。 子表達式
x++, x++
在右側表示“將一個添加到x
並返回x
的舊值,然后將x
加1並返回x
的舊值”。 但是第一個“返回值”被拋棄,第二個部分被分配給y
,即在第一個“加1到x
”部分之后的x
的值,即1。
逗號運算符總是拋棄由其左側計算的值,並返回由其右側計算的值。
我們更明確地打破了它
y = (x++, x++);
x++, /* add 1 to x, giving 1, store 1 in x, return 0 (ignored) */
x++ /* add 1 to x, giving 2, store 2 in x, return 1 */
y = ( ); /* so the 1 gets stored in y */
但請注意,這只是因為逗號運算符為您提供的序列點而定義良好。 對於逗號運算符和只有一兩個其他運算符,可以保證左側的所有內容( x + 1
的計算以及此新值的存儲都返回到x
)首先發生在右側的任何內容之前發生。 但是C中的大多數運營商都不是這樣。
特別是,如果我們要寫出類似的表情
y = (x++ + x++); /* WRONG, undefined */
沒有序列點,所以沒有什么可以告訴我們x
的增量發生在什么順序,什么值會加在一起,什么值將分配給y
。 查看規范問題為什么這些構造使用前后增量未定義行為? 有關這種未定義表達式的更多信息。
哦,回到原來的問題,你說
由於運算符的優先級是R-to-L,我預計......
但這有幾點是錯誤的。
關於最后一點:我現在不打算再寫一篇關於這個主題的長篇文章(參見另一個問題 ),但是如果你試圖找出未定義表達式的行為
y = x-- - x--;
通過說“好吧, -
運算符的關聯性從左到右,所以我們知道左手x--
將首先被評估,然后是右手的”,這將是一個錯誤的結論,不會導致正確預測表達式的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.