我创建了两个函数并将值返回到main部分。
#include <iostream>
using namespace std;
int a =8;
int g(){a++; return a-1;}
int f(){a++; return a;}
int main (){
cout << g()+f()<<endl;
return 0;
}
我不知道为什么输出 18 但 17 。我想知道是否有人能为我详细解释这一点?谢谢你的帮助
答案 0 :(得分:5)
首先,请注意operator +
的参数未按顺序排列,这意味着g()
和f()
可以按两个顺序进行评估,g()
后跟{{ 1}},或f()
后跟f()
。恰巧在这种特殊情况下,这两个排序都以不同的方式得到了相同的结果g()
:
18
后跟g()
:f()
增加g
到a
,然后返回9
。 8
将f
增加到a
并返回10
。总和为10
。
18
后跟f()
:g()
增加f
到a
并返回9
。 9
将g
增加到a
并返回10
。总和为9
。
答案 1 :(得分:1)
这是未定义的行为。编译器可以按任何顺序评估这两个函数调用。
从标准: N3797,1.9,第15段
除非另有说明,否则评估各个运营商的操作数 并且个别表达的子表达式没有被排序。 [ 注意:在表达式中,在表达式中多次计算 程序的执行,无序和不确定的顺序 不必一致地执行其子表达式的评估 在不同的评估中。 -end note]的计算值 操作符的操作数在值计算之前被排序 运营商的结果。如果对标量对象产生副作用 相对于同一标量的另一个副作用而言,它没有排序 使用相同标量值的对象或值计算 对象,行为未定义。
答案 2 :(得分:0)
作为变量&#39; a&#39;在全球范围内宣布,其范围贯穿整个计划。在g()中,a递增到9并且返回a-1,即8.返回语句不会影响a的值。在f()中,a递增到10并返回。现在,print语句就像这个cout&lt;&lt; 8 + 10;并将18打印到控制台。