c++ - 为什么多个减量运算符在 C++ 中工作时不能在 C 中工作?

标签 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 中无效?

最佳答案

在 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< 的修改之间不会有序列点 以及随后的左值到值的转换。 ----x 就更清楚了。 C++ 必须修改排序规则才能使其工作。在 C 语言中,对排序规则的修改可能会导致现有编译器无法符合新规则,因此除非有很大的好处,否则此类修改可能会被拒绝。

关于c++ - 为什么多个减量运算符在 C++ 中工作时不能在 C 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355908/

相关文章:

c - C中的多线程实现本身

c++ - 在 C++ 中重载 **

C++ asterisk 星号运算符

C++ 排序字符串数组

c++ - 成员函数模板特化(在类定义之外定义函数)

c - 在c中写入或读取二进制文件的概率

c# - 重载运算符==后,如何比较两个变量是否指向同一个对象?

c++ - 函数的执行时间在运行时减少。 (C++) 为什么?

c++ - 需要在后代 .h 文件中重新声明被覆盖的函数

c++ - C/C++ : how to get the number of bytes addressed by one address