Pra*_*rav 8 c c++ comma-operator undefined-behavior
我遇到了这个代码片段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");
}
}
Run Code Online (Sandbox Code Playgroud)
1:这不是一个真实的例子.
我的问题是" 在C和C++中是否很好地定义了代码片段的行为? "
我的看法:
在C中,行为很明确,因为6.5.17说
逗号运算符的左操作数被计算为 void表达式 ; 评估后有一个序列点
在C++ 03中,行为很明确,因为5.18说
由逗号分隔的一对表达式从左到右计算,并且左表达式的值被丢弃.
但是,C++ 03(部分6.6.3)也说明了这一点
流出函数的末尾相当于没有值的return; 这会导致值返回函数中的未定义行为.
同样在C中
如果控制到达
}非void函数的end()(除外main()),则行为未定义.
因此,考虑到所有这些要点,我无法判断实际行为.你觉得怎么样?
PS:如果你觉得这个问题没用,你有更好的事情要做,那就自己帮忙吧:D.
我有C规格(C99 TC3)说
如果到达终止函数的},并且调用者使用函数调用的值,则行为未定义.
表示被称为"被评估为空表达式"的表达式的值被丢弃.因此在C情况下,没有未定义的行为.旧C可能有所不同(有些细节,如果我没记错的话).
C++的情况与C略有不同,因为C++支持具有构造函数和析构函数作为返回值的类对象,并且无法保证它们在未初始化的内存上运行.也许这促成了C++的不同规则.