簡體   English   中英

如何評估涉及后增量算子的表達式?

[英]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.

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