为什么C中的多个递减运算符在C中工作?
看看这个问题,并尝试一些代码:
int x = 100; while ( 0 <-------------------- x ) { printf("%d ", x); }
我试图编译与gcc
并得到以下错误:
file.c: In function 'main': file:c:10:27: error: lvalue required as decrement operand while ( 0 <-------------------- x )
但用g++
编译工程。 为什么这个代码在C ++中有效,但不是C?
在C中, – x是一个值,而不是左值。 其效果是减lessx
,并评估到新分配的x
值。 由于--x
不是左值,因此不能递减。
在C ++中, – x是一个左值,而不是右值。 其效果是递减x
,并将x
评估为左值。 由于--x
是一个左值,它可以再次递减。
为什么在C ++中使用--x
作为左值是有道理的,因为C ++引入了引用types。 特定
void f(int &); int i;
调用f(--i)
,在递减之后通过引用传递给i
是有意义的。
由于C没有引用types,所以--i
是一个左值。 历史上,它从来没有,而且与C ++不同,C从未获得改变规则的强制理由。
请注意,C ++需要更多的变化,而不是让--x
左值实际上让它工作。 使--x
左值,没有别的,会使--x
未定义的行为,因为在对x
的修改和随后的左值到值的转换之间不会有序列点。 更为清楚的是,对于----x
。 C ++必须修改sorting规则才能使其工作。 在C中,对sorting规则的修改可能会导致现有编译器符合新规则的问题,所以这样的修改可能会被拒绝,除非有很大的好处。