多变量赋值中的左值和右值
Lvalues and Rvalues in a multi-variable assignment
在下面:
int a, b, c;
a = b = c = 4;
r 值和 l 值是如何分类的?我的猜测是,从解析的角度来看,我们将从 equals/assignment 上的 R 到 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)
这是否或多或少是对赋值、左值和右值的正确理解?
如您所知,左值是具有位置的东西,因此可以出现在赋值运算符的左侧符号上。
在
a = b = c = 4;
我会说 a
、b
和 c
都是左值,而 4
是右值。
如果您需要某物的值,而该某物是右值,那么您就完成了:您有了一个值。如果 something 是左值,则从中获取一个值,这就是您需要的值。
如果您尝试将一个值存储到某物中,而该某物是左值,那么您很幸运:您可以存储它。但是如果 something 是一个右值,你不能,这是一个错误。
当你说
a = b = c = 4;
发生的第一个赋值确实是 4
到 c
,为了使它起作用,c
是一个左值显然很重要。但是当需要进行第二次赋值时,我不认为这是将 c
重新解释为右值:要存储在 b
中的值与刚刚存储在 c
。 (正式地:“在 c = 4
中,结果值是存储到 c
中的值,并且是一个右值。”)
在下面:
int a, b, c;
a = b = c = 4;
r 值和 l 值是如何分类的?我的猜测是,从解析的角度来看,我们将从 equals/assignment 上的 R 到 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)
这是否或多或少是对赋值、左值和右值的正确理解?
如您所知,左值是具有位置的东西,因此可以出现在赋值运算符的左侧符号上。
在
a = b = c = 4;
我会说 a
、b
和 c
都是左值,而 4
是右值。
如果您需要某物的值,而该某物是右值,那么您就完成了:您有了一个值。如果 something 是左值,则从中获取一个值,这就是您需要的值。
如果您尝试将一个值存储到某物中,而该某物是左值,那么您很幸运:您可以存储它。但是如果 something 是一个右值,你不能,这是一个错误。
当你说
a = b = c = 4;
发生的第一个赋值确实是 4
到 c
,为了使它起作用,c
是一个左值显然很重要。但是当需要进行第二次赋值时,我不认为这是将 c
重新解释为右值:要存储在 b
中的值与刚刚存储在 c
。 (正式地:“在 c = 4
中,结果值是存储到 c
中的值,并且是一个右值。”)