为什么多个递减运算符在 C++ 中工作时不能在 C 中工作?
Why don't multiple decrement operators work in C when they work in C++?
查看 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 中无效?
在 C 中,--x
是一个值,而不是左值。它的作用是递减 x
,并求值为 x
的新赋值。由于 --x
不是左值,因此不能递减。
在 C++ 中,--x
是左值,而不是右值。它的作用是递减 x
,并将 x
计算为左值。由于 --x
又是一个左值,所以它可以再次递减。
--x
在 C++ 中作为左值有意义的原因是因为 C++ 引入了引用类型。鉴于
void f(int &);
int i;
调用 f(--i)
可能有意义,它在递减后通过引用传递 i
。
因为 C 没有引用类型,所以 --i
作为左值毫无意义。从历史上看,它从来没有,而且与 C++ 不同,C 从未获得令人信服的理由来更改规则。
请注意,与将 --x
设为左值相比,C++ 需要进行更广泛的更改才能真正让它发挥作用。使 --x
成为左值,没有其他任何东西,将导致 --x
未定义的行为,因为在对 x
的修改和随后的 lvalue-to-value 转换之间不会有序列点。 ----x
更明显。 C++ 必须修改排序规则才能使其工作。在 C 中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此除非有很大的好处,否则此类修改很可能会被拒绝。
查看 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 中无效?
在 C 中,--x
是一个值,而不是左值。它的作用是递减 x
,并求值为 x
的新赋值。由于 --x
不是左值,因此不能递减。
在 C++ 中,--x
是左值,而不是右值。它的作用是递减 x
,并将 x
计算为左值。由于 --x
又是一个左值,所以它可以再次递减。
--x
在 C++ 中作为左值有意义的原因是因为 C++ 引入了引用类型。鉴于
void f(int &);
int i;
调用 f(--i)
可能有意义,它在递减后通过引用传递 i
。
因为 C 没有引用类型,所以 --i
作为左值毫无意义。从历史上看,它从来没有,而且与 C++ 不同,C 从未获得令人信服的理由来更改规则。
请注意,与将 --x
设为左值相比,C++ 需要进行更广泛的更改才能真正让它发挥作用。使 --x
成为左值,没有其他任何东西,将导致 --x
未定义的行为,因为在对 x
的修改和随后的 lvalue-to-value 转换之间不会有序列点。 ----x
更明显。 C++ 必须修改排序规则才能使其工作。在 C 中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此除非有很大的好处,否则此类修改很可能会被拒绝。