f(++i,++i)是否未定义
Is f(++i, ++i) undefined?
我似乎记得在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 之后未指定
在函数调用中,每个参数的值计算和初始化的副作用相对于任何其他参数的值运算和副作用是不确定的。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C/C++预处理器是否可以检测一些编译器选项
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话