1

关于返回语句,Microsoft Visual Studio 文档说

句法:

返回表达式

其中表达式被标记为可选。它继续

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

这很清楚,但另一方面,存在空表达式的概念。这让我很困惑。考虑空表达式不是什么都没有,而是一个空的表达式,我会认为如果我们有一个函数

void foo(void)
{
     return;
}

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

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

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

4

2 回答 2

4

它被称为void 表达式for您可以像以前一样使用 void 表达式。void 表达式只做它的副作用,即调用函数。

事实上,如果 的第一个子句for是任何类型的表达式,它会被评估为 void 表达式:

C99 6.8.5.3for声明

... 如果 Clause-1 是一个表达式,它在控制表达式的第一次评估之前被评估为一个 void 表达式。

C99 6.3.2.2void

void不应以任何方式使用void 表达式(具有类型的表达式)的(不存在的)值,并且不应将隐式或显式转换(到 除外void)应用于此类表达式。如果任何其他类型的表达式被评估为 void 表达式,则其值或指示符将被丢弃。(评估 void 表达式的副作用。)

于 2013-10-20T09:26:26.347 回答
1

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

于 2013-10-20T09:21:52.230 回答