C中的运算符优先级和结构定义

时间:2010-03-17 01:41:36

标签: c pointers struct casting

struct struct0 {
  int a;
};

struct struct1 {
  struct struct0 structure0;
  int b;
} rho;


&rho->structure0; /* Reference 1 */
(struct struct0 *)rho; /* Reference 2 */
(struct struct0)rho; /* Reference 3 */
  1. 从参考文献1中,编译器是否采用rho的地址,然后访问structure0,反之亦然?

  2. 参考文献2中的行是做什么的?

  3. 由于structure0是struct1的第一个成员,引用3是否等同于引用1?

2 个答案:

答案 0 :(得分:4)

按照您的推荐顺序:

  1. ->的优先级高于&。您将获得rho->structure0的地址。或者更确切地说,如果rho是一个指针,你会想。既然不是,你就会遇到编译错误。
  2. 那不行 - 你正在将结构转换为指针类型 - 你应该得到编译错误。
  3. 你也做不到。对非标量类型的类型转换也是一个错误。
  4. 您的示例#2和#3包含在标准6.5.4节中:

      

    除非类型名称指定了void类型,否则类型名称应指定qualified或   不合格的标量类型和操作数应具有标量类型。

    如果你在编译器中放入任何代码,你会看到相同的结果;你所展示的代码不是你想要提出的问题吗?

答案 1 :(得分:2)

&rho->structure0; /* Reference 1 */
(struct struct0)rho; /* Reference 3 */
(struct struct0 *)rho; /* Reference 2 */

所有三个参考都不对:

  • rho不是指针。所以你不能 做rho->structure0但是 (&rho)->structure0
  • 您无法将变量转换为 指针,因此您无法执行(struct struct0)rho;(struct struct0 *)&rho

我真的不明白你想做什么,所以我帮不了你。