为什么return语句在C中作为返回类型为void工作?

为什么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指的是“不返回任何

注意:我在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
指的是“不返回任何内容”,那么我们在这里如何使用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
    )时,由于返回类型不匹配,错误非常突出


我对C89不是很确定,但在C11中,我可以在第§6.8.6.4章中看到

带有表达式的
return
语句不得出现在返回类型为 是
void
。[……]

因此,您的代码违反了标准

关于第二部分,

  • 虽然缺少声明,但由于现在已过时的类型默认为-
    int
    属性,它似乎可以工作,但实际上被调用了,因为您提供了一个
    void
    类型作为
    int
    参数

  • 在具有转发声明(返回类型为
    void
    )时,由于返回类型不匹配,错误非常突出


C11标准草案n1570在前言中说明了以下内容:

第二版[即C99]的主要变化包括:

[……]

-在返回值的函数中不允许使用不带表达式的返回(反之亦然)


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标准中。