评估示例的顺序
Order of evaluation example
我试图一劳永逸地在脑海中设定如何计算表达式。随着我的这个追求,我想出了这个我不知道该怎么做的例子。
#include <iostream>
using namespace std;
typedef void(*func)(int);
void r( int i )
{
cout << i << endl;
}
func f( int i )
{
cout << i << endl;
return &r;
}
int main()
{
int i = 0;
f(++i)(++i);
return 0;
}
使用 MVSC 2008 编译这段代码将生成以下输出:2 2。相同的代码但使用 gcc 4.8.1 编译将引发警告(对 i 的操作可能未定义)并生成以下输出:1 2。
我想理解的是为什么 gcc 4.8.1 认为可能存在未定义行为的情况?两个预增量的副作用是相对于彼此排序的。
干杯安德烈
两个预增量的副作用是相对于彼此排序的。
不,他们不是。每个参数计算在其函数调用之前进行排序,并且函数调用彼此排序;但是两者都可以在第一次调用之前进行评估,在这种情况下,没有什么可以将它们相互排序。
这取决于你所说的"预增量"是什么意思......你是这样读的:
++i
f(i)
++i
f (i) (i)
但是您可以轻松地执行此操作:
++i
++i
f(i)
f(i) (i)
我不认为规范需要一种或另一种方式。
相关文章:
- c++11评估顺序(未定义的行为)
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 令人不安的评估顺序
- 函数参数计算顺序与 Lambda 捕获评估顺序
- std::apply是否为评估顺序提供保证
- 类型(x0 = y0,x1 = y1,x2 = x0,..)的括号和逗号表达中的评估顺序
- 为什么按此顺序评估'--++a-- ++ +b--'?
- C++ C++17 中的序列点和对评估顺序的更改
- 关于使用共享指针的评估顺序
- C 17带有运营商超载功能的评估顺序
- 折叠表达式评估顺序
- C 评估顺序
- X().Y(Z()) 和标准中的评估顺序
- 对同一对象进行评估的链接操作和顺序
- 评估顺序异常
- C++可变参数模板和评估顺序
- 评估示例的顺序
- C++评估顺序:除法与加法
- QML中属性绑定评估的顺序和方式
- 参数顺序评估