"在#34;之前排序和"呼叫功能中的每个评估"在c ++中

时间:2015-05-31 15:10:21

标签: c++

调用函数(包括其他函数调用)中的每个评估(在执行被调用函数体之前或之后没有特别排序)在被调用函数的执行方面是不确定的顺序。

换句话说,函数执行不会相互交错。

"每次评估"是什么意思。

#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++)进行了评估,因此在执行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. 2.它意味着评估++,评估b ++或执行f。

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

    call g, a=1, b=0, call f, a=1, b=1,
    
    1. 表示价值计算或副作用。
    2. 因此,在执行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之前测序。

      是否有可能:

      1. H1

      2. H4

      3. H2

      4. ˚F

      5. H3

2 个答案:

答案 0 :(得分:1)

  

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

我对此的解读是a++b++的副作用必须在f的正文执行之前完成,因此在f内必须是a==1 b==1g。您的示例#2和#3不符合实现。

f的调用通过调用Math.Pi进行不确定的排序,因此可以观察到预增量或后增量值。

答案 1 :(得分:0)

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

编译器可以在上述声明中决定f()g()的执行顺序。

这些只有2种可能性而不是3种。

f()将首先调用并修改变量ab 要么 g()将首先接听电话。