当f&g修改相同的全局变量undefined或unspecified时,表达式f()> g()的值是多少?

abi*_*abi 9 c++ c++11 c++14 c++17

更新:由用户ecatmur标记,它是In 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 ?
Run Code Online (Sandbox Code Playgroud)

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

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

那一个怎么样:

bool z = (x() > i++);  // undefined or unspecified now ?
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 15

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

调用函数(包括其他函数调用)中的每个评估(在执行被调用函数体之前或之后没有特别排序)对被调用函数的执行进行不确定的排序

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

  • @ 0x499602D2:未指定的值(即有效但未知)不是不确定的(可能无效,例如未初始化的变量的值,这是[dcl.init]所说的). (4认同)