更新:如用户ecatmur所示,它与
In C99,is f()+g() undefined or merely unspecified?的重复(尽管有关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的价值是不是没有明确的,还是这个未定义的行为?
根据我的理解(请纠正如果我错了),表达的那种:我>我将是未定义的行为,因为我们在一对序列点之间变异相同的变量两次,但是上述情况(突变发生在单独的函数中)呢?
那这个呢呢
bool z = (x() > i++); // undefined or unspecified now ?
解决方法
在这两种情况下,值都是未指定的,但是行为是明确的.函数调用对于调用它们的表达式中的其他评估是不确定的顺序,如[intro.exececution] 1.9 / 15中所指定:
Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function
所以对i的所有访问都是顺序的,给出了明确定义的行为,但是序列是不确定的,给出了未指定的值.