f(++i,++i)是否未定义

Is f(++i, ++i) undefined?

本文关键字:++i 是否 未定义      更新时间:2023-10-16

我似乎记得在C++11中,他们对排序行为进行了一些更改,现在I++和++I有不同的排序要求。

f(++i, ++i)仍然是未定义的行为吗?f(i++, i++)f(++i, ++i)之间有什么区别?

除非i是类类型,否则这是未定义的行为。来自C++11 1.9/15:

除非另有说明,否则单独运算符的操作数和单独表达式的子表达式的求值都是无序列的。

然后是一个注释,说明这确实适用于函数参数:

[注意:与不同参数表达式相关的值计算和副作用是未排序的。--结束注释]

您的代码在没有排序的情况下对同一对象进行两次修改,因此按相同的段落:

如果标量对象上的副作用相对于同一标量对象上另一个副作用或值计算未排序使用相同标量对象的值,行为是未定义的

如果i是一个类类型,那么++将调用一个函数,并且函数调用总是按顺序排列的。因此,标量对象的任何修改都是不确定的;没有未定义的行为,但结果是未知的。

它仍然是未定义的行为:

如果标量对象上的副作用相对于同一标量对象上另一个副作用或使用同一标量的值进行的值计算是未排序的,则行为是未定义的。

§1.9【介绍执行】

并且函数参数的评估顺序相对于彼此是不排序的。

在C++17中,它不是未定义的。http://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior

f(++i,++i);//在C++17之前未定义的行为,在C++17 之后未指定

在函数调用中,每个参数的值计算和初始化的副作用相对于任何其他参数的值运算和副作用是不确定的。