8

我遇到了这个代码片段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 (in section 6.6.3) 也说

从函数的末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。

同样在 C

如果控制到达}非 void 函数的 end ( )(除了main()),则行为未定义。

因此,考虑到所有这些点,我无法判断实际行为。你们怎么看?

PS:如果你认为这个问题没用,并且你有更好的事情要做,请自助:D。

4

3 回答 3

6

我拥有的 C 规范(C99 TC3)说

如果到达终止函数的},并且调用者使用了函数调用的值,则行为未定义。

被称为“被评估为 void 表达式”的表达式的值被丢弃。所以在 C 的情况下,没有未定义的行为。在旧 C 中可能有所不同(如果我没记错的话,有些细节是)。

C++ 的情况与 C 稍有不同,因为 C++ 支持将构造函数和析构函数作为返回值的类对象,并且无法保证它们在未初始化的内存上运行良好。也许这促成了 C++ 的不同规则。

于 2011-03-24T19:04:51.707 回答
3

这是未定义的行为。

对左表达式的求值会导致返回值函数的末尾没有返回。仅仅因为该值被丢弃并不意味着评估从未发生过。

于 2011-03-23T05:05:53.903 回答
1

这显然是未定义的。C99 §6.3.2.2 说,“(评估一个 void 表达式的副作用。)”因此该函数被评估并最终流出。没有出狱卡。

于 2011-03-23T05:08:17.080 回答