调用函数(包括其他函数调用)中的每个评估(在执行被调用函数体之前或之后没有特别排序)在被调用函数的执行方面是不确定的顺序。
换句话说,函数执行不会相互交错。
"每次评估"是什么意思。
#include <iostream>
using namespace std;
int a = 0;
ing b = 0;
int f(int,int)
{
cout << "call f, ";
cout << "a=" << a << ", ";
cout << "b=" << b << ", ";
return 1;
}
int g()
{
cout << "call g, ";
cout << "a=" << a << ", ";
cout << "b=" << b << ", ";
return 1;
}
int main()
{
f(a++, b++) + g();
return 0;
}
它对函数调用表达式f(a++, b++)
进行了评估,因此在执行g之前或之后对++的评估,b ++的评估和f的执行都进行了排序。
在这种情况下,有两种结果。如果在执行g:
之前对表达式f(a ++,b ++)的求值进行排序 call f, a=1, b=1, call g, a=1, b=1,
如果在评估表达式f(a ++,b ++)之前执行g序列:
call g, a=0, b=0, call f, a=1, b=1,
2.它意味着评估++,评估b ++或执行f。
因此,在执行g之前可以对a ++的评估进行排序,在执行g之后可以对b ++的执行和f的执行进行排序。
call g, a=1, b=0, call f, a=1, b=1,
因此,在执行g之前,可以对++的值计算进行排序,对++的副作用,b ++的评估和f的执行可以在执行g之后进行排序。
call g, a=0, b=0, call f, a=1, b=1,
在这种情况下,
f(a++, b++) + (a = g());
1.value computation of a++
2.execution of g
3.side effect of a++
4.side effect of = (a = 0)
5.evaluation of b++
6.execution of f
call g, a=0, b=0, call f, a=0, b=1,
哪一个是对的?还是其他答案?
我不是说英语的人,而且我不擅长英语。
我希望你能理解我说的话
f(h1(),h2())+ g(h3(),h4())
h1和h2在f之前测序,h3和h4在g之前测序。
是否有可能:
H1
H4
H2
˚F
H3
克
答案 0 :(得分:1)
[expr.post.incr] / 1 ...在修改操作数对象之前,对
++
表达式的值计算进行了排序。关于不确定顺序的函数调用,后缀的操作++
是一次评估。 [注意:因此,函数调用不应介入左值到右值的转换和与任何单个后缀++
运算符相关的副作用。 -end note ] ...
我对此的解读是a++
和b++
的副作用必须在f
的正文执行之前完成,因此在f
内必须是a==1
b==1
和g
。您的示例#2和#3不符合实现。
对f
的调用通过调用Math.Pi
进行不确定的排序,因此可以观察到预增量或后增量值。
答案 1 :(得分:0)
f(a++, b++) + g();
编译器可以在上述声明中决定f()
和g()
的执行顺序。
这些只有2种可能性而不是3种。
f()
将首先调用并修改变量a
和b
要么
g()
将首先接听电话。