C中左值和右值的条件
以下是我读到的关于左值的几个定义
-
可与&运算符一起使用的表达式。 即如果&(表达式)不是错误,则表达式是左值
-
表达式导致非临时对象
-
左值表达式可以在=运算符的RHS和LHS上使用
-
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标准中称为表达式的值 ),它不能被赋值。
++i
和i++
都不是左值。
您可能会考虑*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?