> ==>發信人: UNARY.bbs@bbs.cse.ttu.edu.tw (Rootkit Researcher), 信區: programming
> ※ 引述《tester.bbs@bbs.csie.ncu.edu.tw (try or test)》之銘言:
> > 從結果猜過程就必須去看 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 的式子
> 是要模擬編譯出的組語動作
這是假設 compiler 的動作, 但用 C 表示來模擬.
x++ , ++x 都是兩個動作, 而且是所謂有 side effect 的情況, 此題
x = x++ + ++x ; 還在 expression 計算當中就對 最後結果x 做了
"x=x+1" 動作, 這就涉及 Tinlans 所要強調的 sequence point.
至於 "+" 的動作, 加號的兩邊本來就是都可以任選從那一邊先做.
這當然跟 C 使用 "," 指定次序做, 兩者是有所不同.
假如 compiler 的實作先把 x++ 使用 macro, 例如 get&inc,x 展開,
++x 以 inc&get,x 展開, 跟某實作使用 function GETINC(x) 與 INCGET(x)
來代替, 兩者又會因參數 x 的引用而有所不同.
get&inc,x 假如就是 (temp=x, x=x+1) 就會像前述的 C 表示法了.
這裡引起混淆或者說未規定的就是 兩個動作裡的後一動作 如 x++ 的
x=x+1 是在那一個次序點執行.
寫的不夠清楚, 讓您誤會了.
--
◎ Origin: 中央松濤站□bbs.csie.ncu.edu.tw From: 140.115.6.234