【问题标题】:Operator precedence and struct definition in CC中的运算符优先级和结构定义
【发布时间】:2010-03-17 01:41:36
【问题描述】:
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 的地址,然后访问结构 0,还是反过来?

  2. 参考 2 处的行有什么作用?

  3. 既然结构0是结构1的第一个成员,那么引用3是否等同于引用1?

【问题讨论】:

    标签: c pointers struct casting


    【解决方案1】:

    按照您的参考顺序:

    1. -> 的优先级高于&。您将获得rho->structure0 的地址。或者更确切地说,如果 rho 是一个指针,你会这样做。既然不是,你会得到一个编译错误。
    2. 这行不通 - 您将结构转换为指针类型 - 这样做会导致编译器错误。
    3. 你也不能这样做。对非标量类型的类型转换也是一个错误。

    标准第 6.5.4 节涵盖了您的示例 #2 和 #3:

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

    如果您将任何代码放入编译器中,您会看到相同的结果;你显示的代码不是你想问的吗?

    【讨论】:

    • 如果 rho 的第一个成员是指针,那么引用 1 和 2 是否等价?
    • @Yktula,不,他们仍然无法工作。 rho 本身需要成为尝试任何这些东西的指针。
    • 你是对的。结构 s1 { 结构 { int n } *s0; } *s1; main() { (&s1->sch == (struct s0 *)s1) ? printf("是") : 退出(EXIT_FAILURE);返回0; } 打印是。谢谢。
    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2021-03-29
      • 2013-07-31
      • 2014-11-09
      • 2021-03-16
      • 1970-01-01
      • 2013-02-24
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多