※ 引述《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 ◆