精華區beta Programming 關於我們 聯絡資訊
> ==>發信人: ephesians.bbs@ptt.cc (ephesians), 信區: programming > ※ 引述《ImOnLine (So be it)》之銘言: > : 我剛使用IBM iSeries 的機器計算。 > : 算出來的結果為26。 > : x= 12; x = x++ + ++x; cout<<x; > : 我本來以為程式可以很簡單的拆成下列幾行來看: > : + 的 associativty is right to left: > 讀到目前,我所領會的是, + 左右兩邊的運算式的計算次序不一定. > 以原例 x=12; x=x+++++x;而言, > + 左邊運算式是 x++, 右邊運算式是 ++x, 不規定哪個先處理. > 有些實作先做左邊,就算你所算的,26. > 許多則先從右邊處理,算出27 > + 的結合性是右到左? 這是什麼意義,能不能舉個例子? 從結果猜過程就必須去看 compiling 之後的組語. x=12; x= x++ + ++x ; cout << x; 某一 compiler 可能做相當於下列動作, 註: y, z, p, q 是中間結果. x=12; x =( y=x, x=x+1) + ( z=(x=x+1)); cout << x; 問題是 ( y=x, x=x+1) 的結果是那一個 ? 按次序的話, 最後結果是 x=x+1; 也就是: x=12; x=(p=(y=x,x=x+1)) + (z=(x=x+1)); cout << x; 定義不明的就是 p=(y=x, x=x+1) 的 p 是指 左項的 y , 還是右項的 x=x+1 "," 的計算次序自左至右, 所以最終結果是 右項. 假如 某 compiler implementation 是選最終結果的話, cout << x ; 就會是 27. 假如是選 "自左至右最先看見的項" , 那就會是 26. 這結果的解譯, 同一規則對 x= ++x + x++ 是相同的. 此外, 右項是否受左項影響, 還是只跟前一式 (x=12;) 有關, 在不同程式語言裡, 一直都是定義不同的. 如果把左項 x++ 視同 p=(y=x, x=x+1) , 又當成 p=Function(y=x, x=x+1) , 同理的右項, ++x 也視為是另一個 function 的結果, 就引來右項裡的參數是否 受前項還是只受前一式影響 ? 高階語言是一式相當於組語的好幾式, "=" 通常被當成 " move result into " , 如果被拿來判定區分前一式還是前一項, 當然是因隱藏而區分不明. 美式的 "C 語言程式工程師" 喜歡這種讓 "非行家" 弄混的小把戲, 算是此行的 黑話術語之一吧 ! > 按照一般人理解數學式的次序, + groups left-to-right. > 印象中,讀到的是 + 結合性左到右. -- ◎ Origin: 中央松濤站□bbs.csie.ncu.edu.tw From: 140.115.6.234
ephesians:吼,快瘋了,我要改學functional prog.!! 59.117.130.220 02/24 16:14
UNARYvvv:應該說..找點規格把一切都規定得死死的語220.132.114.113 02/24 23:11
UNARYvvv:言來學習XD220.132.114.113 02/24 23:11
ephesians:這樣講太過度了,side effect不是規格可 59.112.224.119 02/25 02:11
ephesians:限制的 59.112.224.119 02/25 02:12
UNARYvvv:印象中好像是C#還是Java有對C中某未定義220.132.114.113 02/25 02:38
UNARYvvv:行為作了定義,但現在也找不到資料就是220.132.114.113 02/25 02:39
UNARYvvv:唉,其實除了考試,平常就避免寫出這種碼,220.132.114.113 02/25 02:41
UNARYvvv:不就愉快多了嗎..220.132.114.113 02/25 02:41