【发布时间】:2016-01-02 19:16:55
【问题描述】:
在形式的表达式中
f( g(), h() );
未定义g() 和h() 的评估顺序。它只是指定一个必须在另一个之前发生。如果g() 和h() 都具有程序执行所依赖的可见副作用,这是未定义的行为吗?
【问题讨论】:
-
stackoverflow.com/a/621548/276949 - 它将为特定的编译器定义,但不可移植。
-
不是预先定义的行为......但是在一次评估中可能会以这种方式进行评估,而下一次则是另一个订单。如果有特定订单的 UB,那么整个程序都有 UB,与您的实现是否曾经有该特定订单无关。
-
它不是 UB,但不管你怎么称呼它——你的程序都坏了!
-
示例:
int x = 1; int f() { return 1 / x; } int g(int,int) { return --x; } int main() { g(g(0, 0), f()); }。该程序具有未定义的行为,即使您的特定实现可能永远不会在f()之前实际评估g(0,0)。
标签: c++ undefined-behavior operator-precedence side-effects