当L值到R值的转换在C中发生时

当L值到R值的转换在C中发生时,c,lvalue-to-rvalue,C,Lvalue To Rvalue,如果左值出现在编译器需要右值的情况下,编译器会将左值转换为右值 如果T不是函数或数组类型,则T类型的左值e可以转换为右值。转换后的e类型将为T 有人能告诉编译器什么时候需要右值吗?或者什么是简化为左值的表达式转换为右值的Exaclety规则。在C中 当我们试图声明可变大小数组时 int b=8; int a[2*b]; //compiler gives error that constant expression reqd. what is this constant expre

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

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

有人能告诉编译器什么时候需要右值吗?或者什么是简化为左值的表达式转换为右值的Exaclety规则。在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;
当左值到右值转换发生时,它不会给出错误plz??我的困惑是在数组下标中,在第一种情况下,它不会发生左值到右值的转换(在声明时)
但在第二种情况下,您可能正在使用旧的编译器,或者可能需要启用可变长度数组(
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
支持现在是可选的

lvalue
是一个具有内存位置的对象,而
rvalue
是一个临时值,通常不会持续到表达式末尾之后。这篇文章可能是更详细的解释之一


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

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

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

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

左值和右值转换的C++11标准见第4.1章(3485版第85页)。你也可以阅读

(如第一个示例中所示)实际上是允许的,可能您使用的是旧编译器?您使用的是哪种编译器,因为gcc甚至在c90中支持VLA作为扩展。@Duggs_Dojo更新了一些详细信息。