参数顺序评估

时间:2014-11-13 14:38:16

标签: c++ parameters operator-precedence

在以前版本的标准(C ++ 03)中,未指定参数的评估顺序。

在后续版本的标准(C ++ 11或C ++ 14)中是否已更改? 即我们是否可以依赖特定的顺序(从左到右)。

2 个答案:

答案 0 :(得分:3)

没有这一点没有改变,但最近有一个改变这个的提议:N4228: Refining Expression Evaluation Order for Idiomatic C++,这是Pre-Urbana mailing that came out this October的一部分。引言说(强调我的前进 ):

  

表达式评估顺序是一个反复出现的讨论主题   C ++社区。简而言之,给出一个表达式,如f(a,b,c),   评估子表达式f,a,b,c的顺序   未标明标准。如果其中任何两个   子表达式碰巧修改同一个对象而没有干预   序列点,程序的行为是未定义的。对于   例如,表达式f(i ++,i)其中i是整数变量   导致未定义的行为

它建议:

  

我们建议修改C ++评估规则以支持数十年前的规则   惯用的构造和编程实践。简单的解决方案   将要求每个表达式都有明确的定义   评估顺序。这个建议传统上遇到了阻力   很多原因。相反,这个提议建议更有针对性的修复

     
      
  • 后缀表达式从左到右进行计算。 这包括   函数调用和成员节表达式
  •   
  • 分配表达式从右到左进行评估。这包括复合作业。
  •   
  • 从左到右评估转移运算符的操作数
  •   

更新

Herb Sutter最近put out a poll on order of evaluation正在寻求社群对我们对以下代码的期望结果的一些反馈:

std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;

这似乎表明委员会正在认真研究评估顺序的主题,但正如我们从讨论中看到的那样,这是有争议的。

答案 1 :(得分:0)

否则在C ++ 11中仍未指定。这样,您的编译器就可以进行微优化,从而提高代码质量,并且从编译器到编译器各不相同。在不同的编译器上尝试使用增量操作的printf。

函数如int i = foo(3)+ bar(0);有未定义的行为,没有保证功能首先运行。