精華區beta Programming 關於我們 聯絡資訊
> ==>發信人: 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