私が持っている場合
typedef struct{
int i;
} typeB;
typeA *p;
次に: ポインターとキャストからのメンバー アクセスの優先順位は?
(typeB *)p->i
それは実際((typeB *)p)->i
ですか(typeB *)(p->i)
?
私が持っている場合
typedef struct{
int i;
} typeB;
typeA *p;
次に: ポインターとキャストからのメンバー アクセスの優先順位は?
(typeB *)p->i
それは実際((typeB *)p)->i
ですか(typeB *)(p->i)
?
演算子の優先順位表は、a->
がキャストよりも強く結合することを示しています。
typedef void *typeA;
typeB b;
typeA a = &b;
(typeB *)a->i; /* wrong: attempt to dereference a void pointer */
((typeB *)a)->i; /* ok */
後で参照するための完全な演算子の優先順位表を以下に示します。表では、リストの上位にある演算子は、リストの下位にある演算子よりも強くバインドされます (したがって、プライマリ式演算子が最も強くバインドされます)。同じ優先順位の演算子があいまいな方法で同じ式で使用されている場合 (つまり、()
orのような一次式演算子内に取り込まれていない場合[]
)、結合方向に従って解決されます。たとえば、次のような式です。
7 + (3 - 5 * 2 + 15) - 6
次の順序で評価されます (表に従って):
7 + (3 - 10 + 15) - 6 // evaluate * in ()
7 + (-7 + 15) - 6 // evaluate - in () (it is left of the +)
7 + 8 - 6 // evaluate + in ()
15 - 6 // evaluate + (it is left of the -)
9 // evaluate -
もちろん、コンパイラは自由に異なる方法で計算を実行できますが、その結果は、優先順位規則に従って得られた結果と一致する必要があります。
Operator Type Operator(s) Associativity
============= =========== =============
Primary () [] . -> expr++ expr-- left-to-right
Expression
Operators
------------- ----------- -------------
Unary * & + - ! ~ ++expr --expr (typecast) sizeof right-to-left
Operators
------------- ----------- -------------
Binary * / % left-to-right
Operators + -
>> <<
< > <= >=
== !=
&
^
|
&&
||
------------- ----------- -------------
Ternary ?: right-to-left
Operator
------------- ----------- -------------
Assignment = += -= *= /= %= >>= <<= &= ^= |= right-to-left
Operators
------------- ----------- -------------
Comma , left-to-right
============= =========== =============