多变量赋值中的左值和右值

Posted

技术标签:

【中文标题】多变量赋值中的左值和右值【英文标题】:Lvalues and Rvalues in a multi-variable assignment 【发布时间】:2021-01-17 05:11:46 【问题描述】:

如下:

int a, b, c;
a = b = c = 4;

r 值和 l 值是如何分类的?我的猜测是,从解析的角度来看,我们将从等于/赋值的 R-to-L 优先级开始,所以它会是:

c (lv) = 4 (rv)

现在c 的值为4,而b 成为左值:

b (lv) = c/4 (rv)

再说一遍:

a (lv) = b/4

所以,也许它看起来像:

a (lv) = (
    b (lv) = (
        c (lv) = 4 (rv) // start here
    ) (rv)
) (rv)

这或多或少是对赋值、左值和右值的正确理解吗?

【问题讨论】:

abc 都是左值。但是赋值c = 4 的结果是一个右值。而赋值b = (c = 4)的结果是一个右值。 C 不使用术语右值。例如,您可以从左值转换中获得表达式的左值和值。但是,是的,您的解析树是正确的 【参考方案1】:

如您所知,左值是具有位置的东西,因此可以出现在赋值运算符的左侧符号上。

a = b = c = 4;

我会说abc 都是左值,而4 是右值。

如果您需要某物的价值,而该某物是右值,那么您就完成了:您拥有了价值。如果某物是左值,则从中获取一个值,这就是您需要的值。

如果您尝试将值存储到某事物中,而该某事物是左值,那么您很幸运:您可以存储它。但如果某物是右值,则不能,这是一个错误。

当你说

a = b = c = 4;

发生的第一个赋值确实是4c,为了让它工作,c 是一个左值显然很重要。但是当需要进行第二次分配时,我不认为这是将c 重新解释为右值:要存储在b 中的值与刚刚存储在c 中的值相同。 (正式地:“在c = 4 中,结果值是存储在c 中的值,并且是一个右值。”)

【讨论】:

以上是关于多变量赋值中的左值和右值的主要内容,如果未能解决你的问题,请参考以下文章

左值和右值

什么是左值和右值

错误:需要左值作为赋值的左操作数,我收到此错误啥是左值和右值以及如何删除此错误

左值和右值

左值的详解

C语言 啥叫做左值?右值?