int a=21,b=11;
cout<<(--a+b)<<","<<(--b+a);為什么運(yùn)行結(jié)果是"30,31"啊???
急急急。。。。。。。。
posted on 2011-06-09 12:40
DoubleW 閱讀(2598)
評(píng)論(12) 編輯 收藏 引用
FeedBack:
# re: 關(guān)于自增自減的小問(wèn)題
2011-06-09 13:52 |
事實(shí)上我用vs2008,輸出是30,30
不過(guò)據(jù)說(shuō)<<的計(jì)算順序是未定義的,可能是從左向右,可能從右向左,看編譯器的實(shí)現(xiàn)
不過(guò)30,30這個(gè)結(jié)果,我百思不得其解。
回復(fù) 更多評(píng)論
# re: 關(guān)于自增自減的小問(wèn)題
2011-06-09 13:56 |
@K.V
不僅<<沒(méi)定義(事實(shí)上vs2010debug+從左到右release+從右到左),而且兩個(gè)--和兩個(gè)<<之間的順序也沒(méi)有準(zhǔn)確定義……
所以一般來(lái)說(shuō)我們認(rèn)為,如果一個(gè)語(yǔ)句里出現(xiàn)了i++,那么這個(gè)語(yǔ)句里面唯一能出現(xiàn)i的地方就在這里。文章里面的例子違反了這個(gè)不成文的守則。
回復(fù) 更多評(píng)論
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
2011-06-09 17:02 |
在gcc下,是30,31
在vs08下,是30,30
其實(shí)還有更多詭異的事情....
在vs08下 如果隨便寫(xiě)一個(gè)
int fuck(int t)
{
cout<<t<<endl;
return t;
}
int main()
{
int t=4,k;
(double)fuck(++t)/fuck(++t);
k=(double)fuck(++t)/fuck(++t);
}
有沒(méi)有加'k=' 會(huì)影響到編譯器是否同步傳入的實(shí)參.............
換句話(huà)說(shuō),如果fuck的返回值不會(huì)被用到,則t不同步,否則,同步.......
gcc就沒(méi)這個(gè)問(wèn)題。
考試之前,你熟悉下你們題庫(kù)是基于哪一個(gè)編譯器的哪個(gè)版本,然后摸清了它的脾氣,針對(duì)性的來(lái)用規(guī)律,就ok.
回復(fù) 更多評(píng)論
# re: 關(guān)于自增自減的小問(wèn)題
2011-06-09 19:23 |
標(biāo)準(zhǔn)沒(méi)有規(guī)定先對(duì)哪個(gè)求值,完全由編譯器決定,而對(duì)于這種標(biāo)準(zhǔn)未定義的東西,沒(méi)必要去浪費(fèi)時(shí)間,你只需知道求值順序不確定就行,在實(shí)際編碼中就不應(yīng)該出現(xiàn)這樣的代碼。
PS:其實(shí)你可以BS下出這種題目的人。
回復(fù) 更多評(píng)論
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題
# re: 關(guān)于自增自減的小問(wèn)題