亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

i =(i,++ i,1)+1; 做?

i =(i,++ i,1)+1; 做?

ITMISS 2019-11-27 14:04:35
閱讀有關未定義行為和序列點的答案后,我編寫了一個小程序:#include <stdio.h>int main(void) {  int i = 5;  i = (i, ++i, 1) + 1;  printf("%d\n", i);  return 0;}輸出為2。哦,天哪,我沒有看到減價的到來!這是怎么回事另外,在編譯上面的代碼時,我得到警告說:px.c:5:8:警告:逗號表達式的左操作數無效  [-Wunused-value]   i = (i, ++i, 1) + 1;                        ^為什么?但是可能我的第一個問題的答案會自動回答。
查看完整描述

3 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

在表達式中(i, ++i, 1),使用的逗號是逗號運算符


逗號運算符(由標記表示,)是一個二進制運算符,它評估其第一個操作數并丟棄結果,然后評估第二個操作數并返回此值(和類型)。


因為它丟棄其第一個操作數,所以通常僅在第一個操作數具有所需副作用的情況下才有用。如果未對第一個操作數產生副作用,則編譯器可能會生成有關該表達式的警告,但無效。


因此,在上面的表達式中,i將評估最左邊的值并將其值丟棄。然后++i將被求值并將其遞增i1,并再次++i舍棄表達式的值,但對to的副作用i是永久的。然后1將被求值,表達式的值將為1。


相當于


i;          // Evaluate i and discard its value. This has no effect.

++i;        // Evaluate i and increment it by 1 and discard the value of expression ++i

i = 1 + 1;  

請注意,上面的表達式是完全有效的,并且不會調用未定義的行為,因為在逗號運算符的左操作數和右操作數的求值之間存在一個序列點。


查看完整回答
反對 回復 2019-11-27
?
MM們

TA貢獻1886條經驗 獲得超2個贊

引自C11,章節6.5.17,逗號運算符


逗號運算符的左操作數被評估為void表達式;在它的評估與正確操作數的評估之間存在一個順序點。然后評估正確的操作數;結果具有其類型和價值。


所以,就您而言,


(i, ++i, 1)

被評估為


i,被評估為無效表達式,值被舍棄

++i,被評估為無效表達式,值被舍棄

最終1,值返回了。

因此,最終聲明看起來像


i = 1 + 1;

并i到達2。我想這可以回答您的兩個問題,


如何i獲得值2?

為什么會有警告消息?

注意:FWIW,因為有一個序列中的點存在于左手操作數的評價后,表達等(i, ++i, 1)將不會調用UB,作為一個可普遍認為誤。


查看完整回答
反對 回復 2019-11-27
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

i = (i, ++i, 1) + 1;

讓我們逐步分析它。


(i,   // is evaluated but ignored, there are other expressions after comma

++i,  // i is updated but the resulting value is ignored too

1)    // this value is finally used

+ 1   // 1 is added to the previous value 1

這樣我們得到2。現在的最終賦值是:


i = 2;

無論是在我現在是覆蓋前。


查看完整回答
反對 回復 2019-11-27
  • 3 回答
  • 0 關注
  • 816 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號