我有一段我想了解的(旧版)代码;看起来像这样:
void *a = (uint32 *)&b->c.d;
我的问题: 什么存储在?是吗?
我正在C中寻找运算符优先级,但找不到此类优先级的文档。
答案 0 :(得分:8)
这就是我的想法。
->
和.
并不是真正的中缀运算符。它们的右边不是表达式:如果x.y
和x->y
有效,那么(x).y
和(x)->y
也是有效的,但是您不能写x.(y)
或x->(y)
。右侧始终是普通标识符,而不是一般表达式。
这就是为什么我称.
和->
元后缀运算符的原因:对于每个标识符foo
,.foo
和->foo
都是后缀运算符。
C语言中运算符优先级的一般规则是,后缀运算符具有最高优先级,其次是前缀运算符,其次是中缀运算符。
您的表情
(uint32 *)&b->c.d
具有两个前缀运算符((uint32 *)
和&
)和两个后缀运算符(->c
和.d
)。 (格式为( TYPE ) EXPR
的广播也是前缀运算符。)由于后缀优先于前缀,因此我们可以将其括弧为
(uint32 *)(&((b->c).d))
其评估如下:
b
的值,该值必须是指向结构或联合的指针。c
字段,该字段本身必须是结构或联合。d
字段。uint32 *
。