【问题标题】:Why do we need to use 'return 0' at the end of a function in C?为什么我们需要在 C 中的函数末尾使用'return 0'?
【发布时间】:2016-11-27 20:03:46
【问题描述】:

我真的不明白为什么我们需要在函数末尾使用return 0;。我有点理解为什么我们在 main() 的末尾需要它(表示程序结束?)但我真的不明白为什么我们在常规函数的末尾也需要它。

【问题讨论】:

  • 这取决于 - 它只是表示没有错误的约定
  • main 是唯一不需要需要return 语句的函数(截至C99)。
  • @dreamlax void 函数也不需要return 声明,还是我错了?
  • @HonzaDejdar:是的,更多的是指出 OP 提到他理解为什么 main 需要一个,但不明白为什么所有其他功能都需要它,我说的是出于OP正在询问的功能,main是保证不需要的功能。
  • 为什么人们不赞成这个问题? OP显然是新手;人们应该期望新手会用新手的方式提问。

标签: c function return


【解决方案1】:

如果,在你的代码中,你说你的函数返回一个值,但你实际上并没有返回一个值:

int my_function(int x)
{
    // bad practice!
}

...这是一个错误不好的做法。你说你要返回一个值(在本例中是一个'int'),但你没有。

同样,如果您的函数有多个路径:

int my_function(int x)
{
    if (x == 3)
        return 42;  // good

    // bad!
}

并且您再次声明了返回值的意图,但是通过您的函数的某些路径没有,这也是错误不好的做法;你违背了对函数调用者的承诺。

通过函数的所有路径都应该以 return 语句结束:

int my_function(int x)
{
    if (x == 3)
        return 42;  // good

    return 1;  // good
}

如果不想返回任何值,则声明函数为 void:

void my_function(int x)
{
    // good
}

更新: 上面,您可能会注意到我将“an error”替换为“bad practice”。这是因为“错误”一词在 C 标准中意味着非常特殊的东西,而忘记 return 语句不符合该定义(相反,它被认为是“未定义的行为”,您的编译器甚至可能不会抱怨。)但是,作为人类,您应该将其视为代码中的错误,并避免忘记函数中所有退出路径上的 return 语句。

【讨论】:

  • 省略return语句不是C语言错误。如果您都省略了 return 语句,并尝试在调用代码中使用返回值,这只是一个错误。 (而且这个错误的本质是未定义的行为,不需要诊断——编译器不必对此发出警告,尽管有些人会这样做)。
  • 虽然您的评论是正确的,但似乎OP是一个新手,我觉得这些细节对他/她在这么早的阶段来说太多了。我的回答是针对良好的编程实践的。如果你愿意,我可以将“错误”改为“坏”
【解决方案2】:

您不需要在每个函数中都返回 0。例如:

void my_function(int *p_data)
{
    *p_data = 5;
}

int main(void)
{
    int data = 0;
    my_function(&data);
    printf("Data: %d", data);

    return 0;
}

这将完全正常。

【讨论】:

    【解决方案3】:

    如果将返回类型声明为 void,则不会

    【讨论】:

      【解决方案4】:

      如果一个函数被声明为返回void 以外的类型,那么它必须有一个return 语句。唯一的例外是 main 函数,从 C99 开始,它可以省略 return 语句(省略时,行为与结束 } 之前有 return 0; 语句相同main)。

      考虑这个错误的test 函数:

      int test(int a)
      {
          if (a == 0)
              return 123;
      }
      
      int main()
      {
          int x;
          x = test(0); // x equals 123
          x = test(1); // x equals ???
      }
      

      如果你用 0 作为参数调用test,函数会返回 123,但是如果你用 0 以外的值调用它呢?你期望结果是什么? C 中的函数没有“默认返回值”,如果返回类型不是voidmain 函数除外),则必须给出返回值。 p>

      【讨论】:

        【解决方案5】:

        调试

        在linux中调试,一般程序执行正确时返回0,返回码可以在终端执行echo $?得到。您可以创建自己的状态代码,例如:

        int func(){
           if (1) return 9; //true
           return 0;
        int main (){
           return func();
        }
        
        $ gcc t.c
        $ ./a.out
        $ echo $?
        9
        $
        

        What is echo $? in linux terminal?

        【讨论】:

          猜你喜欢
          • 2012-12-03
          • 2020-11-18
          • 1970-01-01
          • 1970-01-01
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          • 2010-11-16
          相关资源
          最近更新 更多