可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)編譯器如何遍歷printf參數並給出輸出結果?
int main()
{
int a=1;
printf("%d %d %d",a,a++,++a);
return 0;
}
上面的代碼是給輸出3 2 3爲什麼????
可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)編譯器如何遍歷printf參數並給出輸出結果?
int main()
{
int a=1;
printf("%d %d %d",a,a++,++a);
return 0;
}
上面的代碼是給輸出3 2 3爲什麼????
這是不確定的行爲
a++, ++a
在同一序列中的點完成,這是不確定的行爲。
從Undefined behavior and sequence points:
在標準中§5/ 4說
之前和下一序列點之間的標量對象應具有其存儲的值由 評價改性至多一次一種表達。
這是什麼意思?
非正式它指的是兩個序列點之間的變量不能被修改一次以上。在一個表達式語句中,下一個序列點通常在終止分號處,而前一個序列點在前一個語句的結尾處。表達式也可以包含中間順序點。
我相信,它被稱爲「序列點」,而不是「迭代點」 –
感謝的話,我一直在尋找它,我沒有得到它,所以我用迭代 – MOHAMED
未定義:修改標量值序列點,這是你的代碼做兩次之間。 f(i++, ++i)
是未定義的行爲,因爲它修改了i
兩次而沒有中間順序點。
問題是標籤C,但該鏈接是一個C++鏈接。 – ouah
@ouah是的,我是**從那裏學習**概念和它的一個很好的鏈接!,我應該刪除**?** –
前和postincrementing力學描述如下:http://c-faq.com/expr/evalorder2.html。但是,如前面的答案中所述,此表達式是不確定的。
Hmmmm,我不知道老師是給了這個愚蠢的功課(http://stackoverflow.com/questions/14120417/what-is-the-order-of-calling-convention-in-c-and-c) 。 –