9

更新:正如用户ecatmur所标记的,它是在 C99 中的副本,是 f()+g() 未定义还是未指定?(虽然问题是关于 C99 的,但 C++ 的答案是不变的)。答案是:未指定(对于这两种情况)。


考虑以下 C++14 代码片段:

int i = 0;
int x() { i++; return i;}
int y() { i++; return i;}
bool z = (x() > y());  // unspecified or undefined ?

z 仅仅是未指定的值,还是未定义的行为?

根据我的理解(如果我错了,请更正),这样的表达式:i++ > i++将是未定义的行为,因为我们在一对序列点之间对相同的变量进行两次变异,但是上面的情况呢(变异发生在单独的职能) ?

那这个呢:

bool z = (x() > i++);  // undefined or unspecified now ?
4

2 回答 2

15

在这两种情况下,值都是未指定的,但行为是明确定义的。函数调用相对于调用它们的表达式中的其他评估是不确定的,如 [intro.execution] 1.9/15 中所述:

调用函数(包括其他函数调用)中的每个求值,如果在被调用函数的主体执行之前或之后没有特别排序,则相对于被调用函数的执行是不确定的

所以所有的访问i都是有序的,给出了明确定义的行为,但是序列是不确定的,给出了一个未指定的值。

于 2015-03-02T18:46:46.777 回答
0

这是未指定的行为。

参考:http ://en.cppreference.com/w/cpp/language/eval_order :

未指定任何表达式中子表达式的求值顺序

两者bool z = (x() > y());bool z = (x() > i++);都是未指定的行为。
您可以做的唯一假设是x()并且y()将在之前 >处理。
没有其他任何保证。

于 2015-03-02T18:38:11.327 回答