逗号运算符和void表达式

时间:2011-03-23 05:01:02

标签: c++ c undefined-behavior comma-operator

我遇到了这段代码 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。

3 个答案:

答案 0 :(得分:6)

我的C规格(C99 TC3)说

  

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

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

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

答案 1 :(得分:3)

这是未定义的行为。

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

答案 2 :(得分:1)

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