C++ 在同一等式中增加f(+;+;i)和g(+;+;i)会输出相同的i值吗?
我参加了一个编译器课程,得到了以下等式:C++ 在同一等式中增加f(+;+;i)和g(+;+;i)会输出相同的i值吗?,c++,C++,我参加了一个编译器课程,得到了以下等式: int i = 5, j = 9, k; k = f(++i) + g(++i) + j + 45; 我为f和g做了一个函数,它们都接受(inti)并返回I。 结果,f和g都返回i=7 我想知道为什么f和g都输出I=7,而不是f是I=6,g是I=7。 当我在visualstudios中运行它时,g的输出首先运行,然后是f f(++i)不应该先走,然后再走g(++i)吗?因为f(++i)首先出现在方程的左至右处。?来自: 在没有插入序列点的情况下写入同一
int i = 5, j = 9, k;
k = f(++i) + g(++i) + j + 45;
我为f和g做了一个函数,它们都接受(inti)并返回I。
结果,f和g都返回i=7
我想知道为什么f和g都输出I=7,而不是f是I=6,g是I=7。
当我在visualstudios中运行它时,g的输出首先运行,然后是f
f(++i)不应该先走,然后再走g(++i)吗?因为f(++i)首先出现在方程的左至右处。?来自:
在没有插入序列点的情况下写入同一变量两次是未定义的行为。根据,J.2未定义的行为:
在两个序列点之间,一个对象被多次修改,或者被修改并读取先前的值,而不是确定要存储的值(6.5)
参考6.5表达式,第5段:
在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的计算修改一次。此外,之前的值应为只读,以确定要存储的值
C规范的附录C中有一个方便的所有序列点列表:
以下是5.1.2.3中描述的序列点:
- 对参数求值后对函数的调用(6.5.2.2)
- 以下运算符的第一个操作数的结尾:逻辑与(6.5.13);逻辑或(6.5.14);有条件的
(6.5.15);逗号?
(6.5.17),
- 完整声明符的结尾:声明符(6.7.5)李>
- 完整表达式的结尾:初始值设定项(6.7.8);表达式语句中的表达式(6.8.3);选择语句的控制表达式(
或如果
)(6.8.4);开关
语句(6.8.5.3)的而
或
语句的控制表达式(6.8.5);的每个表达式;
返回语句中的表达式(6.8.6.4)
- 在库函数返回之前(7.1.4)
- 与每个格式化输入/输出函数转换说明符(7.19.6、7.24.2)相关联的操作之后
- 在对比较函数的每次调用之前和之后,以及在对比较函数的任何调用和作为该调用参数传递的对象的任何移动之间(7.20.5)
C++不需要从左到右进行评估。