查看: 1853|回復: 3
打印 上一主題 下一主題

[解決] Undefined behavior - 討論區

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-8-4 18:59:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    在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
    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-8-22 22:33
  • 簽到天數: 120 天

    [LV.7]常住居民III

    70

    主題

    386

    帖子

    2247

    積分

    金牌會員

    Rank: 6Rank: 6

    積分
    2247

    程式設計達人 - 2014新手達陣

    頭香
    發表於 2014-8-4 20:01:14 | 只看該作者
    我有查到這個 以位元 XOR 賦值 a^=b
    位元運算子 是啥東東?

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

    --------------------------------
    Process exited after 0.02403 seconds with return value 0
    請按任意鍵繼續 . . .
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    3#
     樓主| 發表於 2014-8-4 21:00:47 | 只看該作者
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2014-9-27 02:19
  • 簽到天數: 23 天

    [LV.4]偶爾看看III

    12

    主題

    94

    帖子

    976

    積分

    高級會員

    Rank: 4

    積分
    976

    熱心會員

    4#
    發表於 2014-8-4 22:38:34 | 只看該作者
    在我的環境(x64Win7 gcc 32bit)下
    a^=b^=a^=b; 跑出來的結果一樣是 3 2
    之後我稍微換了一下運算式(自己偷加c)
    發現它運算的順序似乎是從最後一組往前算,就是
    b^=a; a^=b; b^=a; a^=b;

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

    難道在別的環境下會跑出不同的結果?
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表