c – 当f&g修改相同的全局变量未定义或未指定时,是否为表达式f()> g()的值?

前端之家收集整理的这篇文章主要介绍了c – 当f&g修改相同的全局变量未定义或未指定时,是否为表达式f()> g()的值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新:如用户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的所有访问都是顺序的,给出了明确定义的行为,但是序列是不确定的,给出了未指定的值.

猜你在找的C&C++相关文章