UPDATE:由用户标记ecatmur,它是重复的在 C99 中,f()+g() 是未定义还是只是未指定? https://stackoverflow.com/questions/3951017/in-c99-is-fg-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
merely未指定,或者这是未定义的行为?
根据我的理解(如果我错了,请纠正),这样的表达:i++ > i++
将是未定义的行为,因为我们在一对序列点之间对同一变量进行两次变异,但是上面的情况又如何(其中变异发生在单独的函数中)?
那么这个呢:
bool z = (x() > i++); // undefined or unspecified now ?
在这两种情况下,值都是未指定的,但行为是明确定义的。函数调用相对于调用它们的表达式中的其他计算而言是不确定的顺序,如 [intro.execution] 1.9/15 中指定的:
调用函数(包括其他函数调用)中的每个计算,如果在被调用函数体执行之前或之后没有以其他方式专门排序,则相对于被调用函数的执行不确定地排序
所以所有访问i
是有序的,给出了明确定义的行为,但序列是不确定的,给出了未指定的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)