C++ 中的"sequenced before"和"Every evaluation in the calling function"

"sequenced before" and "Every evaluation in the calling function" in c++

本文关键字:in the calling evaluation function 中的 sequenced before C++ Every      更新时间:2023-10-16

调用函数(包括其他函数调用(中在被调用函数体执行之前或之后没有特别排序的每个求值,都是相对于被调用函数的执行不确定排序的。

换言之,函数执行并不相互交错。

"每次评估"的含义是什么。

#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;
}
  1. 它表示函数调用表达式f(a++, b++)的求值,因此a++的求值、b++的求值和f的执行都是在g执行之前或之后排序的。

    在这种情况下,有两种结果。如果在执行g:之前对表达式f(a++,b++(的评估进行测序:

    call f, a=1, b=1, call g, a=1, b=1,

    如果g的执行是在表达式f(a++,b++(求值之前排序的:

    call g, a=0, b=0, call f, a=1, b=1,

2.它意味着评估a++、评估b++或执行f。

因此,a++的评估可以在g的执行之前排序,b++的评估和f的执行可以在g执行之后排序。

call g, a=1, b=0, call f, a=1, b=1,
  1. 它意味着价值计算或副作用

因此,a++的值计算可以在执行g之前排序,a++副作用、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之前测序。

有可能吗:

  1. h1

  2. h4

  3. h2

  4. f

  5. h3

  6. g

[expr.post.incr]/1++表达式的值计算在修改操作对象之前进行排序。对于不确定序列的函数调用,后缀的操作CCD_ 5是一个单独的评价。[注意:因此,函数调用不应介入左值到右值的转换和与任何单个后缀++运算符相关的副作用之间。--结束注释]。。。

我对此的理解是,a++b++的副作用必须在执行f的主体之前完成,因此在f中必须是a==1b==1。您的示例#2和#3不可能采用一致的实施方式。

g的调用与对f的调用不确定地排序,因此可以观察到增量前或增量后的值。

f(a++, b++) + g();

编译器可以决定上面语句中f()g()的执行顺序。

这只是两种可能性,而不是三种。

f()将首先调用并修改变量abg()将首先得到呼叫。

相关文章: