精華區beta Programming 關於我們 聯絡資訊
※ 引述《tester.bbs@bbs.csie.ncu.edu.tw (try or test)》之銘言: > > 讀到目前,我所領會的是, + 左右兩邊的運算式的計算次序不一定. > > 以原例 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. 不清楚上面你加入 y, z, p, q 的式子 是要模擬編譯出的組語動作 還是仍然是 C 語言敘述? 如果已經不算是實際 C 敘述的話...以下就不必看了 :) 在 C 語言中 (d,e,f) 整個式子就是由左至右計算,最後整個式子得出 f 若是某 compiler 實作整個式子是得出「自左至右最先看見的項」 那真的該換了,根本不合標準 因為「得出最右項」這行為並非 implementation-defined > 這結果的解譯, 同一規則對 x= ++x + x++ 是相同的. > 此外, 右項是否受左項影響, 還是只跟前一式 (x=12;) 有關, 在不同程式語言裡, > 一直都是定義不同的. > 如果把左項 x++ 視同 p=(y=x, x=x+1) , 又當成 p=Function(y=x, x=x+1) , 同上,這邊若是在講 C 語言 則 comma operator 跟用來分隔 function 參數的 comma 意義是完全不同的 所以若把 p=(y=x, x=x+1) 和 p=Function(y=x, x=x+1) 做類比應該是不太妥當.. x,y,p 假如是三個變數 p=(y=x, x=x+1) 這種算式是有明確結果的:y=x -> x=x+1 -> p=x > 同理的右項, ++x 也視為是另一個 function 的結果, 就引來右項裡的參數是否 > 受前項還是只受前一式影響 ? > 高階語言是一式相當於組語的好幾式, "=" 通常被當成 " move result into " , > 如果被拿來判定區分前一式還是前一項, 當然是因隱藏而區分不明. > 美式的 "C 語言程式工程師" 喜歡這種讓 "非行家" 弄混的小把戲, 算是此行的 > 黑話術語之一吧 ! > > 按照一般人理解數學式的次序, + groups left-to-right. > > 印象中,讀到的是 + 結合性左到右. -- , 秘密情人 (bbs.cse.ttu.edu.tw) ~\ Post From: 220-132-114-113.HINET-IP.hinet.net