C结构的&(地址)vs->(成员访问)的优先级?

时间:2018-10-01 03:48:35

标签: c struct operator-precedence

我有一段我想了解的(旧版)代码;看起来像这样:

void *a =  (uint32 *)&b->c.d;

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

  1. 指向d的指针存储到a?
  2. 强制转换d(uint32 *)的“值”并存储在a中?
  3. 还有什么?

我正在C中寻找运算符优先级,但找不到此类优先级的文档。

1 个答案:

答案 0 :(得分:8)

这就是我的想法。

->.并不是真正的中缀运算符。它们的右边不是表达式:如果x.yx->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))

其评估如下:

  1. 采用b的值,该值必须是指向结构或联合的指针。
  2. 取消引用它并获取c字段,该字段本身必须是结构或联合。
  3. 获取d字段。
  4. 取其地址。
  5. 将地址保存到uint32 *