看板 C_and_CPP 關於我們 聯絡資訊
提到這些未定義行為 有一個說法是這樣的 一個變數在一句敘述內被給值兩次以上就會發生 前一陣子在版上有看到 有人提出a^=b^=a^=b;的方式交換變數 結果畫出語法樹之後 不管有無括號都有可能出錯 所以不可行 但是我想到一個以前的問題 比方說有四個變數a, b, c, d 如果這樣寫 a = b = c = d; 每個變數都只有一次給值 那麼結果會讓abc都變成d的值嗎? 會不會有編譯器弄出的程式 結果變成a=b; b=c; c=d;這樣的效果? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.210.62
LPH66:這個倒不會 這是因為 = 被規定為右結合的關係 12/15 15:05
LPH66:那個例子之所以會錯是因為我們無法正確得知對 a 的設值取值 12/15 15:06
LPH66:的順序的關係 和 ^= 是右結合並沒有關係 12/15 15:06
LPH66:a^=b^=a^=b; 的實際運算依然是由右至左 只是我們無法確定 12/15 15:07
LPH66:那個 a 的新值什麼時候進去 12/15 15:07
LPH66:而這個情形裡並沒有任何一個動作的順序和結果有關 12/15 15:08
LPH66:所以 a=b=c=d; 是安全的 12/15 15:08
iamstudent:感謝。所以重點是取值與設值的順序 12/15 16:43
iamstudent:那麼a+=b+=c+=d;應該也是安全的 12/15 16:44
ericinttu:有順序性跟沒有順序性的指令... 12/15 17:22
diabloevagto:還是別玩這些東西搞自己比較實在 12/16 00:24
xatier:不能同意樓上更多 12/16 06:09
Favonia:建議不用花太多心思在這裡,因為陷阱多到學也學不完... 12/16 09:54
Favonia:如果有簡單又安全的寫法,就用簡單又安全的寫法吧。 12/16 09:54
iamstudent:我的想法比較不一樣吧,如果是未定義 12/16 15:02
iamstudent:我會希望能回答出這是未定義,而不是回答我不會這樣寫 12/16 15:03
ericinttu:你是主考官嘛? "我會希望能回答出這是未定義" 12/16 16:07