为什么多个递减运算符在C ++中工作时不能在C中工​​作?

时间:2017-02-20 23:17:01

标签: c++ c operators decrement

查看this问题并尝试一些代码:

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?

1 个答案:

答案 0 :(得分:90)

在C中,--x是一个值,而不是左值。其效果是减少x,并评估新分配的x值。由于--x不是左值,因此无法递减。

在C ++中,--x是左值,而不是右值。它的作用是递减x,并评估为x作为左值。由于--x再次是左值,因此可以再次递减。

为什么--x在C ++中成为左值是有道理的,因为C ++引入了引用类型。给定

void f(int &);
int i;

调用f(--i)可能是有意义的,i在递减后通过引用传递--i

由于C没有引用类型,--x作为左值没什么意义。从历史上看,它从未如此,与C ++不同,C从未获得改变规则的令人信服的理由。

请注意,C ++需要更广泛的更改,而不是让--x左值实际让它工作。使--x左值,没有任何其他值,会使x未定义的行为,因为在----x的修改和随后的左值转换之间不存在序列点。对于@media (min-width: @screen-sm-min) { .navbar { min-height: 20px; } .navbar-brand, navbar-nav li > a { line-height: 20px; height: 20px; padding-top: 0px; } .navbar-brand { padding: 8px !important; } .navbar-toggle { margin-right: 18px; } } 来说更为清楚。 C ++必须修改排序规则才能使其正常工作。在C中,对排序规则的修改可能会导致现有编译器符合新规则的问题,因此除非有很大的好处,否则这些修改可能会被拒绝。