以下是我读到的关于左轮手枪的几个定义
可用于&amp ;;的表达式运营商。即如果&(表达式)不是错误,则表达式为左值
导致非临时对象的表达式
左值表达式可用于RHS和LHS =运算符
rvalue表达式只能用于RHS
如果错误请更正
这是问题
我读到++ x是左值,x ++是右值
int i = 0;
printf("%p",(void*)&++i);
如果是这样,为什么这是一个错误?
如果lvalue表达式可用于lhs
int i = 0;
++i = 10;
为什么我不能使用上面的语句?以上都导致错误
更新:以上陈述在C ++中都很好
答案 0 :(得分:4)
++i
和i++
都不是左值。
您可能会考虑*x++
和*++x
这两个都是左值(如果x有指针类型)。
答案 1 :(得分:3)
++i
仅在{strong> C ++ 中为lvalue
,在 C 中为rvalue
(称为值为
答案 2 :(得分:2)
我认为这个问题会被关闭,我只留下评论。真是个大错误;)
在C中(问题的标签是 C )++ i运算符会“返回”一个值,而不是变量本身。因此无法检索到它的地址。换句话说,++i
不是左值。两者都不是i++
。
http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/
对于C ++,这两个是左值。
这个简单的代码:
#include <stdio.h>
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
答案 3 :(得分:1)
来自C11的(相当含糊的)正式定义:
(强调粗体字体由我添加)
6.3.2.1左值,数组和函数指示符
左值是一个表达式(对象类型不是void)可能指定一个对象(64);如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员)或具有const限定类型的所有包含聚合或联合的元素。
脚注(非规范性)及进一步说明:
64)名称“左值”最初来自赋值表达式E1 = E2,其中左操作数E1需要是(可修改的)左值。它可能更好地被视为表示对象“定位器值”。有时被称为“rvalue”的内容在本国际标准中被描述为“表达的价值”。
因此,左值必须是“潜在地”指定对象的东西。无论“潜在”的意思是开放的个人解释......
尽管有上述脚注,但C标准缺乏正确的右值定义。具有讽刺意味的是,整个标准中提到右值的唯一地方是一脚注。
在你的情况下,++ i和i ++都没有指定一个实际的对象,所以它们都不是左值。它们相当于价值。
答案 4 :(得分:0)
通过将++i
设为左值,假设您现在可以执行:
int i=2;
++i = ++i;
除了鼻守护进程之外,你希望i
之后看起来像什么? 4? 3?