【问题标题】:Using rvalues with the & operator将右值与 & 运算符一起使用
【发布时间】:2020-12-29 12:59:13
【问题描述】:

我一直在努力理解下面的 C 代码:

struct s {
        char m1;
        char m2;
};

int  main()
{
    /* This will print 1 */
    printf("%d\n", &((struct s*)0)->m2);

}

下面的部分在稍作修改后似乎有点混乱:

&((struct s*)0)->m2

在编译和运行初始代码时,我得到的答案是 1,这是我希望得到的。

我修改了代码,将&((struct s*)0)->m2 替换为 &((struct s*)0),然后我收到一条错误消息,提示“需要左值作为一元 '&' 操作数”。

问题:在原始代码部分&((struct s*)0)->m2 中,& 的参数不是右值吗?如果是,那为什么编译成功,而修改&((struct s*)0)的情况下却没有?

【问题讨论】:

    标签: c literals rvalue lvalue


    【解决方案1】:

    在这种情况下:

     &((struct s*)0)
    

    & 的操作数是强制转换的结果,它总是一个右值。在这种情况下:

    &((struct s*)0)->m2
    

    & 的操作数是 -> 运算符的结果,它是一个左值,特别是命名字段。另请注意,此表达式会导致 undefined behavior,因为通过 -> 运算符取消引用 NULL 指针值。

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 2021-06-16
      • 2020-04-22
      • 2017-11-17
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多