在以前版本的标准(C ++ 03)中,未指定参数的评估顺序。
在后续版本的标准(C ++ 11或C ++ 14)中是否已更改? 即我们是否可以依赖特定的顺序(从左到右)。
答案 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);有未定义的行为,没有保证功能首先运行。