[問題] 同一行程式碼變更變數兩次

看板C_and_CPP作者 (史瑞克)時間15年前 (2010/10/13 15:30), 編輯推噓7(7012)
留言19則, 6人參與, 最新討論串1/2 (看更多)
請問以下程式碼: int Function ( int a, int b ) { int max = 0, sum = 0; sum = sub_Function_a ( max ) + sub_Function_b ( max++ ); } // int Function() 這種情況執行出來一定是 Segmentation fault 這種錯誤算十三戒中的第幾戒? -- Plurk: http://www.plurk.com/shrekwang Blog: http://shrekat.blogspot.com ____ _ _ __ __ / ___|| |__ _ __ ___| | __ \ \ / /_ _ _ __ __ _ \___ \| '_ \| '__/ _ \ |/ / \ \ /\ / / _` | '_ \ / _` | ___) | | | | | | __/ < \ V V / (_| | | | | (_| | |____/|_| |_|_| \___|_|\_\ \_/\_/ \__,_|_| |_|\__, | -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 221.120.69.156

10/13 15:32, , 1F
眼殘,找到了,第 8 戒......
10/13 15:32, 1F

10/13 15:36, , 2F
我眼殘了,找不到錯在哪
10/13 15:36, 2F

10/13 15:39, , 3F
為什麼要給人腦編譯器高度挑戰呢?
10/13 15:39, 3F

10/13 15:54, , 4F
錯在呼叫兩個 sub_Function 的地方;
10/13 15:54, 4F

10/13 15:58, , 5F
那錯在哪呢,我一直看不出來>"<
10/13 15:58, 5F

10/13 16:02, , 6F
這行並沒有改變數二次. 這行的問題是在執行順序沒有定義
10/13 16:02, 6F

10/13 16:45, , 7F
10/13 16:45, 7F

10/13 16:48, , 8F
還是原PO你貼的程式碼部份根本不是錯的地方?你應該貼出
10/13 16:48, 8F

10/13 16:49, , 9F
那兩個函數的內容
10/13 16:49, 9F

10/13 17:06, , 10F
錯在同一個 sequence point 區間內對變數又寫又讀
10/13 17:06, 10F

10/13 17:07, , 11F
無法保證 a 的結果。用 gcc4 開 -Wall 的話會跳 warning
10/13 17:07, 11F

10/13 17:08, , 12F
瞭解,可是 Segmentation fault 應該是出錯時的訊息,未定
10/13 17:08, 12F

10/13 17:09, , 13F
第八誡中提到當然你不該對其值修改一次以上,
10/13 17:09, 13F

10/13 17:09, , 14F
義行為,不一定導致程式錯誤,通常是結果錯誤?
10/13 17:09, 14F

10/13 17:09, , 15F
但其實又讀又寫各一次意思是雷同的,無法保證誰先執行到
10/13 17:09, 15F

10/13 17:09, , 16F
進而無法保證這整段程式的結果正確性。
10/13 17:09, 16F

10/13 17:10, , 17F
確實他這段 code 會 seg fault 可能有其他原因
10/13 17:10, 17F

10/13 17:11, , 18F
但是單就讀 a 又 a++ 這段的「未定義行為」,本來就有可能
10/13 17:11, 18F

10/13 17:11, , 19F
會造成 seg fault,因為什麼都有可能發生,你不能猜測
10/13 17:11, 19F
文章代碼(AID): #1CjM0aAF (C_and_CPP)
文章代碼(AID): #1CjM0aAF (C_and_CPP)