※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《ephesians (ephesians)》之銘言:
: : 讀到目前,我所領會的是, + 左右兩邊的運算式的計算次序不一定.
: : 以原例 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
C 的associativity
Type Associativity Operators
L→R () [] –> .
Unary R→L ! ~ + – * & (type) sizeof ++ ––
Binary arithmetical L→R * / %
Binary arithmetical L→R + –
Shifts L→R << >>
Comparisons L→R < <= > >=
Comparisons L→R == !=
Binary bitwise L→R &
Binary bitwise L→R ^
Binary bitwise L→R |
Binary boolean L→R &&
Binary boolean L→R ||
Ternary R→L ?:
Assignments R→L = += –= *= /= &= |= ^= <<= >>=
C++
Level Operator Description Grouping
1 :: scope L->R
2 () [] . -> ++ -- dynamic_cast postfix L->R
static_castreinterpret_cast
const_cast typeid
3 ++ -- ~ ! sizeof new delete unary (prefix) R->L
* & indirection and
reference (pointers)
+ - unary sign operator
4 (type) type casting R->L
5 .* ->* pointer-to-member L->R
6 * / % multiplicative L->R
7 + - additive L->R
8 << >> shift L->R
9 < > <= >= relational L->R
10 == != equality L->R
11 & bitwise AND L->R
12 ^ bitwise XOR L->R
13 | bitwise OR L->R
14 && logical AND L->R
15 || logical OR L->R
16 ?: conditional R->L
17 = *= /= %= += -= >>= <<= &= ^= != assignment R->L
18 , comma L->R
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.153.213