【问题标题】:Why return statement works for void as return type in C?为什么 return 语句适用于 void 作为 C 中的返回类型?
【发布时间】:2016-08-02 16:19:57
【问题描述】:

注意:我在代码块 IDE 上使用 windows 7 和 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()
{

}

为什么会这样?

【问题讨论】:

  • 你是如何编译你的代码的,你的编译器有没有发出一些警告?
  • this 应该很有用,尽管它可能不会直接回答您的第一个问题。你越早熟悉 UB 的概念,对你越好,IMO。
  • 您的代码有未定义的行为。这正是未定义行为的未定义程度。

标签: c function return void c89


【解决方案1】:

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

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

所以,你的代码违反了标准。

关于第二部分,

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

  • 虽然有前向声明(返回类型为void),但由于返回类型不匹配,错误很突出。

【讨论】:

  • 同一句话出现在C99标准中。
【解决方案2】:

C11 标准草案 n1570 在前言中说:

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

[...]

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


C89 标准接着说:

约束

带有表达式的return语句不得出现在返回类型为void的函数中。

但是,没有提到禁止没有表达式出现在返回类型为 not void 的函数中的 return 语句。

因此,从 void 返回值在 C89 中也不正确。


请注意,C11 也不允许没有返回类型的main()。但是,GCC 对许多此类边界情况非常放松,除非提供了-pedantic-errors 选项。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2022-12-09
    • 2018-06-26
    • 2011-06-23
    • 2014-08-31
    • 2022-12-04
    • 2015-03-14
    • 2015-06-29
    相关资源
    最近更新 更多