竹園論壇

標題: Undefined behavior - 討論區 [打印本頁]

作者: Sylveon    時間: 2014-8-4 18:59
標題: Undefined behavior - 討論區
在C++中,除了語法規定的範圍以外,有許多的模糊空間,如下例
[C++] 純文本查看 復制代碼
#include<iostream>
#include<climits>

using namespace std;

int main()
{
        cout<<INT_MAX+1<<endl;
}


在課程中,我們知道INT_MAX代表int的最大值,我們在此假定為32bit的2147483647,但是INT_MAX+1會變成什麼? 是-2147483648嗎? 這答案是「不一定」。


這就是Undefined behavior,又稱未定義行為。因為在語法規範中,本來就不允許程式設計師發生溢位,理所當然的,也不會因為不小心的「犯規」而多衍伸一個條例。

下面再舉個例子

[C++] 純文本查看 復制代碼
#include<iostream>
#include<climits>

using namespace std;

int main()
{
        int a=2,b=3;
        a^=b^=a^=b;
        cout<<a<<' '<<b<<endl;
}




請大家執行這段程式碼,猜猜看a^=b^=a^=b;,這一行在做什麼,有什麼功用,以及為什麼這是Undefined behavior


相關資料
http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/

C語言十戒
https://www.ptt.cc/bbs/SFFamily/M.1134111686.A.5F8.html
英文版!?
http://www.lysator.liu.se/c/ten-commandments.html

作者: Panda_Liu    時間: 2014-8-4 20:01
我有查到這個 以位元 XOR 賦值 a^=b
位元運算子 是啥東東?

我跑出來的結果(X64)
3 2

--------------------------------
Process exited after 0.02403 seconds with return value 0
請按任意鍵繼續 . . .

作者: Sylveon    時間: 2014-8-4 21:00
可以參考這一篇文章
http://acm.nudt.edu.cn/~twcourse/BitwiseOperation.html
作者: tntchn    時間: 2014-8-4 22:38
在我的環境(x64Win7 gcc 32bit)下
a^=b^=a^=b; 跑出來的結果一樣是 3 2
之後我稍微換了一下運算式(自己偷加c)
發現它運算的順序似乎是從最後一組往前算,就是
b^=a; a^=b; b^=a; a^=b;

但還是不知道它為什麼是Undefined behavior……

難道在別的環境下會跑出不同的結果?




歡迎光臨 竹園論壇 (http://forum.tfcis.org/) Powered by Discuz! X3.2