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