【发布时间】:2011-07-21 00:57:04
【问题描述】:
我遇到了这段代码 sn -p 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:这不是现实生活中的例子。
我的问题是“代码 sn-p 的行为是否在 C 和 C++ 中定义良好?”
我的看法:
在 C 中,行为是明确定义的,因为 6.5.17 说
逗号运算符的左操作数被评估为 void 表达式;求值后有一个序列点
在 C++03 中,这种行为是明确定义的,因为 5.18 说
以逗号分隔的一对表达式从左到右进行计算,左侧表达式的值丢弃。
但是 C++03(6.6.3 部分)也这么说
从函数末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。
在 C 中也是如此
如果控制到达非 void 函数(
main()除外)的结尾 (}),则行为未定义。
因此,考虑到所有这些点,我无法判断实际行为。大家怎么看?
P.S:如果你认为这个问题没用,而且你还有更好的事情要做,请自助:D.
【问题讨论】:
-
其他人所说的......并且调用范围内没有原型的可变参数函数会调用未定义的行为。
-
@pmg :假设已包含必要的标头。 :)
标签: c++ c undefined-behavior comma-operator