首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C和C++中+=的结果是什么?

在C和C++中+=的结果是什么?
EN

Stack Overflow用户
提问于 2012-05-18 21:50:54
回答 2查看 8.3K关注 0票数 93

我得到了以下代码:

代码语言:javascript
复制
#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}

如果我尝试将其编译为一个C源代码,使用的是gcc,我得到一个错误:

代码语言:javascript
复制
error: lvalue required as left operand of assignment

但是,如果我使用g++将其编译为C++源代码,则在运行可执行文件时不会出现错误:

代码语言:javascript
复制
i = 20

为什么会有不同的行为?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-18 21:57:58

复合赋值操作符的语义在C和C++中是不同的:

C99标准,6.5.16,第3部分:

赋值操作符将一个值存储在由左操作数指定的对象中。赋值表达式具有赋值后的左操作数的值,但不是左值。

在C++ 5.17.1中:

赋值运算符(=)和复合赋值运算符都从右到左分组。所有这些都需要一个modifi表左值作为其左操作数,并在赋值发生后返回一个带有左操作数的类型和值的左值。

EDIT : (i+=10)+=10在C++中的行为在C++98中未定义,但在C++11中定义良好。有关标准的相关部分,请参阅NPE对问题的this answer

票数 134
EN

Stack Overflow用户

发布于 2012-05-18 21:56:07

除了是无效的C代码之外,这行代码

(i+=10)+=10;

在C和C++03中都会导致未定义的行为,因为它会在序列点之间修改i两次。

至于为什么允许用C++编译:

C++N3242 5.17.1赋值运算符(=)和复合赋值运算符都从右到左分组。它们都需要一个可修改的左值作为其左操作数,并返回一个引用左操作数的左值。

同一段话接着说

在所有情况下,赋值都是在右操作数和左操作数的值计算之后、赋值表达式的值计算之前排序的。

这表明在C++11中,表达式不再具有未定义的行为。

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

https://stackoverflow.com/questions/10653903

复制
相关文章

相似问题

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