我遇到了这段代码 1
int return_printChar1()
{
// code
// oops! no return statement
}
int return_printChar2()
{
// code
return printf("Return");
}
int main()
{
int i;
// some more code
i = return_printChar2();
if((return_printChar1(),i))
{
printf ("Gotcha");
}
}
1:这不是现实生活中的例子。
我的问题是“代码段的行为是否在C和C ++中定义良好?”
我的看法:
在C中,行为定义明确,因为6.5.17
说
逗号运算符的左操作数被评估为 void表达式;评估后有一个序列点
在C ++ 03中,行为定义得很好,因为5.18
说
用逗号分隔的一对表达式从左到右进行评估,左表达式的值为废弃。
但是C ++ 03(在6.6.3
部分中)也说
从函数末尾流出相当于没有值的return;这会导致值返回函数中的未定义行为。
同样在C
如果控制到达非空函数的结束(
}
)(main()
除外),则行为未定义。
因此,考虑到所有这些要点,我无法判断实际行为。你们的人怎么想?
P.S:如果你觉得这个问题毫无用处,而且你有更好的事情要做,那就自己帮忙吧:D。
答案 0 :(得分:6)
我的C规格(C99 TC3)说
如果到达了终止函数的},并且调用者使用了函数调用的值,则行为未定义。
表示被称为“被评估为空表达式”的表达式的值被丢弃。因此在C情况下,没有未定义的行为。旧C可能有所不同(有些细节,如果我没记错的话)。
C ++的情况与C略有不同,因为C ++支持带有构造函数和析构函数作为返回值的类对象,并且无法保证它们在未初始化的内存上运行。也许这促成了C ++的不同规则。
答案 1 :(得分:3)
这是未定义的行为。
对左表达式的求值导致在没有返回的情况下流出值返回函数的末尾。仅仅因为该值被丢弃并不意味着评估从未发生过。
答案 2 :(得分:1)
显然未定义。 C99§6.3.2.2说,“(评估一个空表达式的副作用。)”因此评估函数并从最终流出。没有出狱的免费卡。