0

如果左值出现在编译器需要右值的情况下,编译器会将左值转换为右值。

如果 T 不是函数或数组类型,则类型 T 的左值 e 可以转换为右值。转换后的 e 类型为 T。

有人可以告诉编译器何时需要 Rvalue 。或者什么是精确规则,以便将减少为 Lvalue 的表达式转换为 Rvalue。在 C 中,当我们尝试声明可变大小数组时

  int b=8;
  int a[2*b];     //compiler gives error that constant expression reqd. what is this constant expression (is it rvalue expression)

但是当我这样做的时候

int a[10];
 a[2*b]=89;

当 Lvalue 到 Rvalue 转换发生时,它没有给出错误请有人详细说明?我的困惑是,在第一种情况下,在数组下标中它不会发生左值到右值的转换(在声明时),但在第二种情况下会发生

4

2 回答 2

1

看起来您可能正在使用旧的编译器,或者可能VLA需要启用可变长度数组()支持?VLA支持c99,因为如果您正在使用,gcc您可以更清楚地看到这一点,编译此示例代码:

int main()
{
    int b=8;
    int a[2*b];

    return 0 ;
}

具有以下选项:

gcc -std=c89 -pedantic

你会看到这个错误:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla]

如果你使用c99它很好:

gcc -std=c99 -pedantic 

但重要的是要注意,从 2011 年起,C 标准VLA支持现在是可选的。

Anlvalue是一个具有内存位置的对象,而 anrvalue是一个临时值,通常不会持续超过表达式的末尾。这篇文章Understanding lvalues and rvalues in C and C++可能是更详细的解释之一。

在这种情况下2*b是一个,rvalue因为它不会在表达式之外持续存在。

于 2013-07-14T13:20:09.070 回答
0

左值是具有标识(名称)且不可移动的值。并且右值是一个值而不是左值。

所以有两个概念(它有名字吗?它是可移动的吗?)用于定义什么是左值和什么是右值。

纯右值(prvalue)没有名称且可移动。还有与这个概念相关的xvalue和glvalue。

左值和右值转换的 C++11 标准可在第 4.1 章(版本 3485 的第 85 页)中找到。您还可以阅读 初始化是否需要左值到右值的转换?是`int x = x;` UB吗?

于 2013-08-17T02:05:19.037 回答