繁体   English   中英

逗号运算符和void表达式

[英]Comma operator and void expression

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

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

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

PS:如果你觉得这个问题没用,你有更好的事情要做,那就自己帮忙吧:D。

我有C规格(C99 TC3)说

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

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

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

这是未定义的行为。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM