据我所知,return
void 函数中的语句将引发错误。
但在下面的程序中,情况并非如此。
这里显示的输出是1
。怎么会?
main()
{
int i=5;
printf("%d",fun(fun(fun(i))));
}
void fun(int i)
{
if (i%2)
{
return (i+(7*4)-(5/2)+(2*2));
}
else
{
return (i+(17/5)-(34/15)+(5/2));
}
}
A return
不带表达式的语句:
void func(void) {
return;
}
是完全合法的void
功能。的合法性return
带有表达式的语句取决于您所使用的 C 语言版本。
1990 C 标准规定:
A return
带有表达式的语句不得出现在
返回类型为的函数void
.
该标准的 1999 版和 2011 版均表示:
A return
带有表达式的语句不得出现
在返回类型为的函数中void
. A return
不带表达式的语句只能出现在函数中
其返回类型是void
.
这是一个约束,这意味着编译器必须对任何违反它的程序发出诊断(可能是非致命警告)。
C90 允许return
不带任何表达式的语句void
由于历史原因而发挥作用。 ANSI C 之前的版本没有void
关键字,因此无法定义不返回值的函数。程序员会省略返回类型(默认为int
)并忽略它。 C90 规则允许这样的旧代码编译而不会出现错误。您仍然可能无法从非返回值void
功能;如果调用者尝试使用(不存在的)结果,则程序的行为是未定义的。 1999 年的标准稍微收紧了规则。
你的程序的另一个问题是你调用fun
在其声明可见之前。根据 C99 和更高版本的规则,这是非法的(尽管编译器可能只是对此发出警告)。根据 C90 规则,这是合法的,但编译器会假设该函数返回int
。你的程序的行为是未定义的,但是你的void
功能fun
可能碰巧表现得好像它返回了一个值,并且对它的调用可能碰巧表现得好像它使用了该值。
C 编译器往往对某些错误相当宽松,因此旧代码(有时是在第一个实际标准发布之前编写的)不会被拒绝。但是你的编译器should至少已经警告过你return
声明,可能还有关于无效调用的信息。您应该密切关注编译器警告;它们应该像致命错误一样对待。你应该使用选项来增加编译器警告你的事情的数量。如果您使用 gcc,请使用-std=c90
, -std=c99
, or -std=c11
, 随着-pedantic
强制遵守标准。你可以加-Wall
-Wextra` 启用更多警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)