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

标签 c rvalue lvalue

如下:

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

右值和左值如何分类?我的猜测是,从解析的角度来看,我们将从 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;

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

如果您需要某物的值,并且该某物是右值,那么您就完成了:您拥有了一个值。如果某个东西是左值,您可以从中获取一个值,这就是您需要的值。

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

当你说

a = b = c = 4;

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

关于c - 多变量赋值中的左值和右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65757546/

相关文章:

c - fpos_t 类型变量的格式说明符?

c - r 值和 l 值之间的差异

c++ - 为什么作为返回类型的右值引用不能初始化非常量引用?

c - 尝试递增数组时出现 "lvalue required"错误

c - 这个使用指针函数的C程序有什么问题

c++ - 使用 Rcpp 构建一个 R 包,其中包含带有限制限定符的 C 源代码和 header ?

找不到错误,但它给了我一个

c++ - 有没有办法正确地 std::move const 数据?

c++ - 以在使用临时对象调用时生成编译器错误的方式重载方法

c++ - 为什么 const 函数返回左值而不是右值?