C中左值和右值的条件

以下是我读到的关于左值的几个定义

  1. 可与&运算符一起使用的表达式。 即如果&(表达式)不是错误,则表达式是左值

  2. 表达式导致非临时对象

  3. 左值表达式可以在=运算符的RHS和LHS上使用

  4. rvalue表达式只能用于RHS

请更正错误

这是问题所在

我读到++ x是一个左值,x ++是一个右值

int i = 0; printf("%p",(void*)&++i); 

如果是这样,为什么这是一个错误?

如果lvalue表达式可用于lhs

 int i = 0; ++i = 10; 

为什么我不能使用上面的语句?以上都导致错误

更新:上述两个语句都适用于C ++

++i只是在C ++中lvalue ,在C中它是一个rvalue (在C标准中称为表达式的值 ),它不能被赋值。

++ii++都不是左值。

您可能会考虑*x++*++x这两个都是左值(如果x有指针类型)。

我以为这个问题会被关闭,我只留下评论。 真是个大错;)

在C(问题的标签是C )中,++ i运算符会“返回”一个值,而不是变量本身。 因此无法检索到它的地址。 换句话说, ++i不是左值。 i++也不是。

关于某些构造是l-和r-值,C ++可能与C不同。

http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/

对于C ++,这两个是左值。

这个简单的代码:

 #include  int main() { int i=0; ++i = 10; printf("\n%d\n", i); ++i = ++i; printf("%d\n", i); } 

用gcc编译会给出:

 lvalue.c:3: error: invalid lvalue in assignment lvalue.c:4: warning: incompatible implicit declaration of built-in function 'printf' lvalue.c:5: error: invalid lvalue in assignment 

并为g ++编译正确和yelds:

 10 12 

来自C11的(相当含糊的)正式定义:

(我加入了粗体字强调)

6.3.2.1左值,数组和函数指示符

左值是一个表达式 (对象类型不是void) ,可能指定一个对象 (64); 如果左值在评估时未指定对象,则行为未定义。 当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员)或具有const限定类型的所有包含的聚合或联合的元素。

脚注(非规范性)有进一步说明:

64)名称“左值”最初来自赋值表达式E1 = E2,其中左操作数E1需要是(可修改的)左值。 它可能更好地被视为表示对象“定位器值”。 有时被称为“rvalue”的内容在本国际标准中被描述为“表达的价值”。

因此,左值必须是“潜在地”指定对象的东西。 无论“潜在”的意思是开放的个人解释……

尽管有上述注释,但C标准缺乏正确的rvalue定义。 具有讽刺意味的是,整个标准中提到右值的唯一地方是一脚注。

在你的情况下,++ i和i ++都没有指定一个实际的对象,所以它们都不是左值。 他们是rvalues。

通过使++i成为左值,想象你现在可以做到:

 int i=2; ++i = ++i; 

除了鼻子守护进程之外,你之后想要看起来像什么? 4? 3?