C 和 C++ 中 += 的结果是什么?
What's the result of += in C and C++?
我有以下代码:
#include <stdio.h>
int main(int argc, char **argv) {
int i = 0;
(i+=10)+=10;
printf("i = %dn", i);
return 0;
}
如果我尝试使用 gcc 将其编译为 C 源,则会出现错误:
error: lvalue required as left operand of assignment
但是,如果我使用 g++ 将其编译为C++源,则不会出错,并且当我运行可执行文件时:
i = 20
为什么会有不同的行为?
复合
赋值运算符的语义在 C 和 C++ 中是不同的:
C99 标准,6.5.16,第 3 部分:
赋值运算符将值存储在由左操作数指定的对象中。一 赋值表达式在赋值后具有左操作数的值,但不是 左值。
在 5.17.1 C++:
赋值运算符 (=( 和复合赋值运算符都从右到左分组。都需要可修改的 lvalue 作为其左操作数,并在赋值发生后返回一个包含左操作数类型和值的 lvalue。
编辑:C++中(i+=10)+=10
的行为在C++98中未定义,但在C++11中定义良好。有关标准的相关部分,请参阅NPE对问题的回答。
除了是无效的 C 代码外,该行
(i+=10)+=10;
将导致 C 和 C++03 中的行为未定义,因为它会在序列点之间修改两次i
。
至于为什么允许在C++中编译:
[C++N3242 5.17.1] 赋值运算符 (=( 和复合赋值运算符都从右到左分组。都需要 可修改的左键值作为其左操作数,并返回引用左操作数的左键值。
同一段接着说,
在所有情况下,赋值都是在值之后排序的 计算左右操作数,以及在赋值表达式的值计算之前。
这表明在C++11中,该表达式不再具有未定义的行为。
相关文章:
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- std::chrono::duration::count函数的实际结果类型是什么
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- C++:术语的计算结果不是采用 1 个参数的函数
- ZTV,ZTS,ZTI 在 gdb x/nfu "vtable_address" 的结果中是什么意思?
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 如何打印返回值的结果?我是一个初学者学习C++
- 即使在C 中越过初始化阵列的极限后,结果也是如此
- 使用FP:快速导致错误的VC 结果(不仅仅是不准确)结果 - 这是编译器错误
- 我收到此错误:错误 c2064:term 的计算结果不是采用 0 个参数的函数,但我不明白为什么
- C++时间()给我的结果几乎是随机的
- 三元运算符的结果不是右值
- 为什么"decltype(i+j)"的结果不是右值引用?
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- wxwidgets Bind()项的计算结果不是在event.h中使用1个参数的函数
- 我正在尝试用C++制作一个费用计算器,我得到了错误C2064:term的计算结果不是一个带1个参数的函数
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 字符* 到字符串 c++(结果不是预期的)
- 错误C2064:术语的计算结果不是一个带1个参数的函数,我该如何克服这个错误