3 回答

TA貢獻(xiàn)1906條經(jīng)驗 獲得超10個贊
在表達(dá)式中(i, ++i, 1),使用的逗號是逗號運算符
逗號運算符(由標(biāo)記表示,)是一個二進(jìn)制運算符,它評估其第一個操作數(shù)并丟棄結(jié)果,然后評估第二個操作數(shù)并返回此值(和類型)。
因為它丟棄其第一個操作數(shù),所以通常僅在第一個操作數(shù)具有所需副作用的情況下才有用。如果未對第一個操作數(shù)產(chǎn)生副作用,則編譯器可能會生成有關(guān)該表達(dá)式的警告,但無效。
因此,在上面的表達(dá)式中,i將評估最左邊的值并將其值丟棄。然后++i將被求值并將其遞增i1,并再次++i舍棄表達(dá)式的值,但對to的副作用i是永久的。然后1將被求值,表達(dá)式的值將為1。
相當(dāng)于
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;
請注意,上面的表達(dá)式是完全有效的,并且不會調(diào)用未定義的行為,因為在逗號運算符的左操作數(shù)和右操作數(shù)的求值之間存在一個序列點。

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊
引自C11,章節(jié)6.5.17,逗號運算符
逗號運算符的左操作數(shù)被評估為void表達(dá)式;在它的評估與正確操作數(shù)的評估之間存在一個順序點。然后評估正確的操作數(shù);結(jié)果具有其類型和價值。
所以,就您而言,
(i, ++i, 1)
被評估為
i,被評估為無效表達(dá)式,值被舍棄
++i,被評估為無效表達(dá)式,值被舍棄
最終1,值返回了。
因此,最終聲明看起來像
i = 1 + 1;
并i到達(dá)2。我想這可以回答您的兩個問題,
如何i獲得值2?
為什么會有警告消息?
注意:FWIW,因為有一個序列中的點存在于左手操作數(shù)的評價后,表達(dá)等(i, ++i, 1)將不會調(diào)用UB,作為一個可普遍認(rèn)為誤。

TA貢獻(xiàn)2036條經(jīng)驗 獲得超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?,F(xiàn)在的最終賦值是:
i = 2;
無論是在我現(xiàn)在是覆蓋前。
添加回答
舉報