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

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,作為一個可普遍認為誤。

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;
無論是在我現在是覆蓋前。
添加回答
舉報