将右值与 & 运算符一起使用
Posted
技术标签:
【中文标题】将右值与 & 运算符一起使用【英文标题】: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)
的情况下却没有?
【问题讨论】:
【参考方案1】:在这种情况下:
&((struct s*)0)
&
的操作数是强制转换的结果,它总是一个右值。在这种情况下:
&((struct s*)0)->m2
&
的操作数是 ->
运算符的结果,它是一个左值,特别是命名字段。另请注意,此表达式会导致 undefined behavior,因为通过 ->
运算符取消引用 NULL 指针值。
【讨论】:
以上是关于将右值与 & 运算符一起使用的主要内容,如果未能解决你的问题,请参考以下文章