【问题标题】:Is a return statement always necessary? [duplicate]是否总是需要返回声明? [复制]
【发布时间】:2018-07-31 15:22:53
【问题描述】:

有什么区别:

#include <stdio.h>

int f(int x){
    return x*x - 3;
}

int main(){
    int x = 4;
    printf("f(%d) = %d\n", x, f(x));
    return 0;
}

#include <stdio.h>

int f(int x){
    x*x - 3;
}

int main(){
    int x = 4;
    printf("f(%d) = %d\n", x, f(x));
    return 0;
}

因为这两个编译没有错误(使用gcc)并且两个都在工作。 第一次返回真的很重要吗?

【问题讨论】:

  • 如果你想返回一个值,是的,你必须显式返回它。如果它似乎没有它也能工作,那是个意外。
  • return 不是函数
  • MSVC 给出 两个 警告:“'-':运算符无效;预期运算符有副作用”和“'f':必须返回值”。所以提高你的警告级别(或者如果他们给出了他们认真对待)。
  • @SouravGhosh 返回可能是一个函数。你不知道。

标签: c return


【解决方案1】:

第二个 sn-p 调用undefined behaviour

到达结尾}并在调用者中使用返回值的函数调用未定义的行为。

引用C11,第 6.9.1 章

如果到达终止函数的},并且函数调用的值被 调用者,行为未定义。

所以,是的,对于一个函数

  • 返回除void 以外的任何内容(并且其值将在调用者中使用),必须包含带有表达式的return 语句,该表达式具有 类型与函数的返回类型相同。
  • 返回void,可以有一个return 不带任何表达式的语句。不过,this can be also be omitted 没有任何问题。

注意:仅仅因为“您的”编译器(设置)编译代码并生成二进制文件,并不意味着代码是正确的。使用所有警告标志和严格检查,它们将为您省去很多麻烦

【讨论】:

  • 我知道如果编译器编译,那是没有必要的吧。但我没有明确的警告,这就是我问这个问题的原因。谢谢 :) (最后用 clang 编辑有一个警告。我使用 gcc 和 tcc (测试)没有警告)。我搜索了,但我不太明白,知道是的,谢谢。
  • -> naguam 有疑问时,使用最高级别的严格检查。正如@weathervane 在评论中提到的那样,您应该已经看到了警告。
  • @naguam:由于行为是 undefined,如果您忘记了 return 语句,编译器不需要发出任何类型的诊断。不过,如果您提高警告级别,大多数人都会这样做。
  • @DivakarRajesh 不,不符合 C 标准..
  • @DivakarRajesh 有些语言会这样做,例如阿洛戈尔68。 C 逗号运算符也具有这种语义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
相关资源
最近更新 更多