如果我有
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
============= =========== =============
在 C 中, -> 运算符的优先级高于 cast ,即 (type name)
所以 (typeB *)p->i 是 (typeB *)(p->i)