在C中,如果foo的返回类型为void,表达式foo()可以用作空表达式吗?

时间:2013-10-20 09:16:46

标签: c return void undefined-behavior

关于return语句,Microsoft Visual Studio文档说

  

语法:

     

返回表达式;

其中expression被标记为可选。它继续

  

表达式的值(如果存在)将返回给调用函数。如果表达是   省略,函数的返回值是未定义的。

这很清楚,但另一方面,有一个空表达的概念。这让我感到困惑。认为空表达不是没有,而是作为一个空的表达,我会认为如果我们有一个函数

void foo(void)
{
     return;
}

然后可以在允许空表达式的任何地方使用表达式foo()。例如,代码的行为

unsigned int i=0;
for(foo();i<10;i++) printf("%u",i);

将被定义。 我知道这可能没什么实际意义,但我想理解为什么在这种情况下,空表达式不是表达式。

2 个答案:

答案 0 :(得分:4)

它被称为无效表达。您可以像for一样在for中使用void表达式。 void表达式只会产生副作用,即调用函数。

实际上,如果for的第一个子句是任何类型的表达式,它将被计算为void表达式:

  

C99 6.8.5.3 void陈述

     

...如果子句-1是一个表达式,则在第一次评估控制表达式之前将其计算为void表达式。

  

C99 6.3.2.2 void

     

void表达式(具有类型void的表达式)的(不存在)值不应   以任何方式使用,隐式或显式转换({{1}}除外)不得   适用于这样的表达。如果任何其他类型的表达式被评估为void   表达式,其值或指示符被丢弃。 (评估void表达式   副作用。)

答案 1 :(得分:1)

我不知道C中是否存在“空表达式”这样的东西,但是如果有,那么你会把它与类型void和与此同时,你混淆了从非void函数(这是非法的)返回“nothing”的行为,而忽略了for循环的初始化表达式(这是合法的)。