为什么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规则的修改可能会导致现有编译器符合新规则的问题,所以这样的修改可能会被拒绝,除非有很大的好处。