C ++求和程序

时间:2014-12-03 09:24:44

标签: c++

我创建了两个函数并将值返回到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 。我想知道是否有人能为我详细解释这一点?谢谢你的帮助

3 个答案:

答案 0 :(得分:5)

首先,请注意operator +的参数未按顺序排列,这意味着g()f()可以按两个顺序进行评估,g()后跟{{ 1}},或f()后跟f()。恰巧在这种特殊情况下,这两个排序都以不同的方式得到了相同的结果g()

  • 18后跟g()f()增加ga,然后返回98f增加到a并返回10。总和为10

  • 18后跟f()g()增加fa并返回99g增加到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打印到控制台。