为什么return语句在C中作为返回类型为void工作?
注意:我在IDE代码块上使用Windows7和gcc编译器 我发现所有形式的回报 如果返回类型为 功能失效 例如:为什么return语句在C中作为返回类型为void工作?,c,function,return,void,c89,C,Function,Return,Void,C89,注意:我在IDE代码块上使用Windows7和gcc编译器 我发现所有形式的回报 如果返回类型为 功能失效 例如: void message() //If i skip this declaration still it works main() { message(); } void message() { return 5; //also return 5.0 and return a(some variable) also works } 既然,void指的是“不返回任何
void message() //If i skip this declaration still it works
main()
{
message();
}
void message()
{
return 5; //also return 5.0 and return a(some variable) also works
}
既然,void
指的是“不返回任何内容”,那么我们在这里如何使用return语句呢。这是否意味着所有程序都返回某个内容,无论它是void还是其他返回类型
我还有一个关于void
作为返回类型的查询:
如果我使用这个程序
main()
{
printf("%d",message());
}
void message()
{
}
它的输出为1
并且没有给出错误
但是如果我使用这个,我会得到一个错误:
void message(); //when I use the declaration
main()
{
printf("%d",message());
}
void message()
{
}
为什么会发生这种情况?我不太清楚C89,但在C11中,我可以在第§6.8.6.4章中看到 带有表达式的
return
语句不得出现在返回类型为
是void
。[……]
因此,您的代码违反了标准
关于第二部分,
- 虽然缺少声明,但由于现在已过时的类型默认为-
属性,它似乎可以工作,但实际上被调用了,因为您提供了一个int
类型作为void
参数int
- 在具有转发声明(返回类型为
)时,由于返回类型不匹配,错误非常突出void
return
语句不得出现在返回类型为
是void
。[……]
因此,您的代码违反了标准
关于第二部分,
- 虽然缺少声明,但由于现在已过时的类型默认为-
属性,它似乎可以工作,但实际上被调用了,因为您提供了一个int
类型作为void
参数int
- 在具有转发声明(返回类型为
)时,由于返回类型不匹配,错误非常突出void
C89标准规定如下: 约束条件 带有表达式的返回语句不得出现在返回类型为
void
的函数中
但是,没有提到禁止返回类型不是void
的函数中没有表达式的返回语句
因此,从void
返回值在C89中也不正确
请注意,C11也不允许不带返回类型的
main()。然而,GCC对许多此类边界情况非常宽松,除非提供了-迂腐错误选项。C11标准草案n1570在前言中说明如下:
第二版[即C99]的主要变化包括:
[……]
-在返回值的函数中不允许使用不带表达式的返回(反之亦然)
C89标准规定如下:
约束条件
带有表达式的返回语句不得出现在返回类型为void
的函数中
但是,没有提到禁止返回类型不是void
的函数中没有表达式的返回语句
因此,从void
返回值在C89中也不正确
请注意,C11也不允许不带返回类型的main()。然而,GCC对这些边界情况中的许多都很放松,除非提供了-pedanticerrors
选项。您如何编译代码,编译器是否收到了一些警告?应该是有用的,尽管它可能不会直接回答您的第一个问题。IMO,您越早熟悉UB的概念,对您就越好。您的代码具有未定义的行为。这就是未定义行为的未定义程度。你是如何编译代码的,你的编译器有没有收到一些警告?应该是有用的,尽管它可能不会直接回答您的第一个问题。IMO,您越早熟悉UB的概念,对您就越好。您的代码具有未定义的行为。这正是未定义行为的未定义程度。相同的句子出现在C99标准中。相同的句子出现在C99标准中。