指针和强制转换的成员访问优先级

时间:2013-06-13 00:44:19

标签: c casting operator-precedence

如果我有

 typedef struct{
       int i;
 } typeB;

 typeA *p;

然后:指针成员访问和强制转换之间的优先级是什么?

 (typeB *)p->i  

实际上是((typeB *)p)->i还是(typeB *)(p->i)

2 个答案:

答案 0 :(得分:3)

运算符优先级表将显示->绑定比投射更紧密。

typedef void *typeA;
typeB b;
typeA a = &b;
(typeB *)a->i;   /* wrong: attempt to dereference a void pointer */
((typeB *)a)->i; /* ok */

下面提供了一个完整的运算符优先级表供您将来参考。在表中,列表中较高的运算符比列表中较低的运算符绑定得更紧密(因此主表达式运算符绑定最紧密)。如果相同优先级的运算符以不明确的方式在同一表达式中使用(即,未在主表达式运算符中捕获,如()[]),则通过遵循关联方向来解析它。所以,例如表达式:

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
=============   ===========                                     =============

答案 1 :(得分:1)

in C, - &gt; operatior的优先级高于cast,即(类型名称)

so(typeB *)p-&gt; i is(typeB *)(p-&gt; i)