Zac*_*wis 0 c struct operator-precedence
我有一段(遗留)代码,我正在努力理解; 它看起来像这样:
void *a = (uint32 *)&b->c.d;
Run Code Online (Sandbox Code Playgroud)
我的问题:什么存储在一个?是吗:
我在C中寻找运算符优先级,我找不到这种优先级的文档.
以下是我对此的看法.
->并.没有真正缀操作符.他们的右手边是不是一个表达式:如果x.y和x->y是有效的,那么是(x).y和(x)->y,但你不能写x.(y)或x->(y).右侧始终是普通标识符,而不是一般表达式.
这就是为什么我打电话.和->元后缀运算符:对于每一个标识符foo,.foo并且->foo是后缀运算符.
C中运算符优先级的一般规则是后缀运算符具有最高优先级,后跟前缀运算符,后跟中缀运算符.
你的表情,
(uint32 *)&b->c.d
Run Code Online (Sandbox Code Playgroud)
有两个前缀运算符((uint32 *)和&)和两个后缀运算符(->c和.d).(Casts(表单( TYPE ) EXPR)也是前缀运算符.)由于postfix beats前缀,我们可以将其括起来
(uint32 *)(&((b->c).d))
Run Code Online (Sandbox Code Playgroud)
评估如下:
b,它必须是指向结构或联合的指针.c字段,该字段本身必须是结构或联合.d领域.uint32 *.