【问题标题】:Order of calls and side effects调用顺序和副作用
【发布时间】:2013-05-09 06:53:12
【问题描述】:

考虑这样的操作:

int a = f1(mystream)*f2(mystream)+f3(mystream);

其中 f1、f2、f3 的形式如下:

int f(std::istream&)

int f(std::ostream&)

我能否保证f1f2f3 将按此顺序执行?

【问题讨论】:

  • 不,它们可以按任何顺序执行。
  • 我很确定它依赖于编译器,g++/MS 已经在左/右和右/左的相反方向上实现了它。

标签: c++ stream operators operator-precedence


【解决方案1】:

不,它们可以按任何顺序执行。这是因为内置的*+ 运算符没有引入sequence point。一些内置运算符,例如||&& 确实会引入序列点并导致定义执行顺序。

【讨论】:

  • 为了迂腐,只有 内置 逻辑运算符定义了一个序列。用户定义类型的重载运算符只是普通的函数调用。
【解决方案2】:

您不能保证每个编译器都使用从左到右的顺序。所以如果你不确定你可以在你的汇编代码中查找它。一旦编译器创建了汇编代码,就可以保证顺序。 看看下面的汇编代码:

cout << f1() * f2() * f3();
00C6452E  call        f1 (0C61096h)  
00C64533  mov         esi,eax  
00C64535  call        f2 (0C6112Ch)  
00C6453A  imul        esi,eax  
00C6453D  call        f3 (0C61127h) 
00C64542  imul        esi,eax  
00C64545  mov         edi,esp 

这是我的编译器创建的代码...

【讨论】:

    【解决方案3】:

    没有。各个子表达式彼此之间没有排序。保证的是任何一个函数调用在另一个函数调用之前完成,但三个函数调用的顺序是不确定的。

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 2015-09-15
      • 2012-02-05
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多