我很好奇,发现当前代码不起作用,但是我不知道为什么:
#include <stdio.h>
void main(){
int a = 42;
printf("%d\n", ++a++);
}
在我看来,这似乎不是一个错误的语法。有人可以解释错误输出吗?
first.c: In function ‘main’:
first.c:5:17: error: lvalue required as increment operand
printf("%d\n", ++a++);
答案 0 :(得分:10)
++a++
等于++(a++)
(由于operator precedence),而a++
返回的值是non-lvalue object expression(也称为 rvalues )。
此类值(本质上)是短暂的,不能由前缀++
运算符修改。
答案 1 :(得分:4)
在C中,++x
是一个值,而不是一个左值。其作用是递增x
,并求值为新分配的值x
。由于++x
不是左值,因此无法递增。
在C ++中,++x
是一个左值,而不是一个右值。其作用是递增x
,并作为左值计算为x
。由于++ x再次是左值,因此可以再次递增。
在C ++中使++x
成为左值是有意义的原因是因为C ++引入了引用类型。给定
void f(int &);
int i;
调用f(++i)
可能有意义,它会在递增i后通过引用传递i。
由于C没有引用类型,所以++ i作为左值没有什么意义。从历史上看,从来没有,而且与C ++不同,C从来没有获得改变规则的令人信服的理由。
请注意,与使++x
成为左值以使其实际工作相比,C ++需要更广泛的更改。使++x
成为左值,而没有其他任何情况,会使++ x发生未定义的行为,因为在对x的修改与随后的左值到值的转换之间没有序列点。对于++++x
更是如此。 C ++必须修改排序规则以使其起作用。在C语言中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此,除非有很大的好处,否则这些修改可能会被拒绝。
答案 2 :(得分:2)
有人可以解释错误输出吗?
这意味着C不支持这种操作。