查看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?
答案 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中,对排序规则的修改可能会导致现有编译器符合新规则的问题,因此除非有很大的好处,否则这些修改可能会被拒绝。