精華區beta Programming 關於我們 聯絡資訊
※ 引述《ephesians (ephesians)》之銘言: : ※ 引述《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 : + 的結合性是右到左? 這是什麼意義,能不能舉個例子? : 按照一般人理解數學式的次序, + groups left-to-right. : 印象中,讀到的是 + 結合性左到右. + 的 associativty 是 left to right,並不是 right to left 簡單來說意思就是若你寫 a + b + c + d 會以這樣子來結合: ( ( (a+b) + c ) + d ) 左邊的先加完,得出的答案再去跟右邊的的相加 而先前的問題就在於一開始那個 a+b 的兩端 到底是 a 先求出還是 b 先求出 (此處 a,b 不一定是單純的變數,也包括 x++ 這種情況) 由於規格把這部份留給編譯器實作來決定 所以才發生可能會看到不同答案的情形 另外 associativty 為 right to left 的 operator 其中一個例如 assignment 寫 a=b=c; 會以這樣結合: a = ( b = c ); 右邊的部份先進行指派,得出結果再指派給左邊的 lvalue -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.114.113
ImOnLine:but if x=(x++)+(++x);in pc always =27. 218.166.214.99 02/24 09:41
UNARYvvv:若測過 PC 上所有編譯器結果如此我沒話說220.132.114.113 02/24 23:05
UNARYvvv:但是依照語言規格我還是會避免寫出那種碼220.132.114.113 02/24 23:08
UNARYvvv:因為不能確定哪天不是那樣實作220.132.114.113 02/24 23:08
UNARYvvv:所以安穩一點還是分開寫兩三個敘述吧..220.132.114.113 02/24 23:10
UNARYvvv:不必非得全部放在同一個 expression220.132.114.113 02/24 23:10