c结构的&(地址)vs - >(成员访问)的优先顺序?

Zac*_*wis 0 c struct operator-precedence

我有一段(遗留)代码,我正在努力理解; 它看起来像这样:

void *a =  (uint32 *)&b->c.d;
Run Code Online (Sandbox Code Playgroud)

我的问题:什么存储在一个?是吗:

  1. 指向d的指针存储到?
  2. 类型转换d(uint32*)的"值"并存储在?
  3. 还要别的吗?

我在C中寻找运算符优先级,我找不到这种优先级的文档.

mel*_*ene 8

以下是我对此的看法.

->.没有真正缀操作符.他们的右手边是不是一个表达式:如果x.yx->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)

评估如下:

  1. 取值b,它必须是指向结构或联合的指针.
  2. 取消引用它并获取c字段,该字段本身必须是结构或联合.
  3. 得到这个d领域.
  4. 拿它的地址.
  5. 将地址转换为uint32 *.