C++ C++;求和程序

C++ C++;求和程序,c++,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; } #包括 使用名称空间std; INTA=8; int g(){a++;返回a-1;} int f(){

我创建了两个函数,并将值返回到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;
}
#包括
使用名称空间std;
INTA=8;
int g(){a++;返回a-1;}
int f(){a++;返回a;}
int main(){

cout首先,请注意,
operator+
的参数没有顺序,这意味着
g()
f()
可以按两个顺序计算,
g()
后接
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
    。总和为
    18


    • 这是未定义的行为。编译器可以按任意顺序计算这两个函数调用

      从标准: N3797,1.9,第15段

      除非另有说明,否则对单个运算符的操作数进行求值 单个表达式的子表达式的和是不排序的[ 注意:在执行过程中多次求值的表达式中 程序的执行,未排序和不确定排序 其子表达式的求值不需要一致地执行 在不同的评估中。-结束注释]计算 运算符的操作数在计算 运算符的结果。如果对标量对象的副作用 相对于同一标量上的另一个副作用未排序 对象或使用相同标量的值计算的值 对象,则行为未定义


      由于变量“a”是全局声明的,它的作用域在整个程序中。在g()中,a增加到9,并返回a-1,即8。return语句不影响f()中a的值,a递增为10并返回。现在,print语句将如下所示:coutf:8+1;g:9+1-1;g+f:18;不记得将首先调用哪个函数,但结果将是正确的。在这种情况下,请澄清您的问题。您希望得到什么(以及为什么)你得到了什么?谢谢你的帮助。我现在就得到它了,因为在C++中,函数参数评估的顺序(没有定义)(尝试)<代码> G-(+)+ f-()
你会得到另一个答案。从同一个函数中返回并变异变量是个坏主意。你会期望什么?也可以看看这个:@你现在得到了什么?谢谢你的详细解释。你的意思是如果函数的顺序不同,会产生完全不同的结果吗?@May W嗯,不管顺序如何,这里得到的是18。但原则上,是的,你不能依赖顺序。如果你传递的表达式不是函数调用,那就更糟糕了。如果你说
a+++++++a
之类的话,那么你会得到未定义的行为,这意味着你的程序可以自由地做任何它喜欢的事情。这不是未定义的行为,而是未定义的行为指定的。不,你错了,行为是未定义的。也许你想说计算顺序是未指定的。不,你错了。这不是未定义的行为。计算顺序是未指定的。我刚刚添加了一个来自标准的引号。不幸的是,这不是告诉你当操作数是结果时会发生什么的引号函数调用的类型。