首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么多个减量运算符在C++中不能在C中工作?

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

Stack Overflow用户
提问于 2017-02-21 07:17:01
回答 1查看 4.7K关注 0票数 48

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

代码语言:javascript
运行
复制
int x = 100;

while ( 0 <-------------------- x )
{
    printf("%d ", x);
}

我尝试用gcc编译,得到以下错误:

代码语言:javascript
运行
复制
file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
 while ( 0 <-------------------- x )

但是使用g++进行编译是可行的。为什么这段代码在C++中有效,而在C中无效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 07:22:32

在C中,--x是一个值,而不是一个左值。它的作用是递减x,并计算为x的新赋值。由于--x不是左值,因此不能递减。

在C++中,--x是一个左值,而不是右值。它的作用是减少x,并将其计算为x作为左值。因为--x又是一个左值,所以可以再次递减。

为什么--x在C++中是一个左值是有意义的,因为C++引入了引用类型。给定的

代码语言:javascript
运行
复制
void f(int &);
int i;

调用f(--i)可能更有意义,它在递减i之后通过引用传递它。

因为C没有引用类型,所以--i作为左值没有什么意义。从历史上看,它从来都不是,而且与C++不同的是,C从未获得改变规则的令人信服的理由。

请注意,C++需要比将--x设置为左值更广泛的更改才能真正工作。在没有任何其他东西的情况下将--x设为左值将使--x行为变得不确定,因为在对x的修改和随后的左值到值的转换之间不存在序列点。对于----x来说,这一点更加明显。C++必须修改排序规则才能使其正常工作。在C中,对排序规则的修改可能会导致现有编译器无法符合新规则,因此这种修改很可能会被拒绝,除非有很大的好处。

票数 91
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42355908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档