C中函数中的void与int

C中函数中的void与int,c,C,只是一个初级问题。在函数中使用int()而不是void()有区别吗?我知道,如果没有返回值,就使用void,但是使用int而不是void会弄糟还是会给出不同的输出?比如: { sample(); return 0; } int sample() { print("example"); } 而不是 { sample(); return 0; } void sample() { print("example"); } 编辑:为那些愚

只是一个初级问题。在函数中使用int()而不是void()有区别吗?我知道,如果没有返回值,就使用void,但是使用int而不是void会弄糟还是会给出不同的输出?比如:

{
  sample();
  return 0;
}
int sample()
{
  print("example");
}
而不是

{
  sample();
  return 0;
}
void sample()
{
  print("example");
}
编辑:为那些愚蠢的例子道歉。。我还是个学生

  • 您将得到一个编译错误,因为程序希望您返回int,但没有“returnint”
  • 函数返回值表示用户希望从函数中得到什么,例如: getNumber()->用户希望从该函数返回一个数字,而不是void

  • 是的,有区别;实际上有好几个

  • int
    用于这两个函数将是无用的,令人困惑,并建议使用不同的函数,如图所示。因此,只有
    void
    是一种不会让所有必须阅读您的代码的人感到困惑的方式
  • 一些编译器和代码检查器,即代码的非人类读者,可能会抱怨
  • 如果使用
    int
    确实有意义(因为函数的代码与所示代码不同),那么返回的值将被忽略,对于那些返回函数变量的值来说,这很可能是一个问题
  • 从Menis的答案(我错过了)来看,他们的2号似乎是我的1号
  • 在函数中使用int()而不是void()有区别吗?我知道,如果没有返回值,就使用void,但是使用int而不是void会弄糟还是会给出不同的输出

    这是一个好问题当你对这些事情感到疑惑时,你应该做的第一件事就是尝试一下。作为一名初级程序员,你会遇到很多这样的问题,只要写一个小例子并进行实验,你就会学到很多东西

    我清理了您的示例,使其成为有效的程序:

    #include <stdio.h>
    
    int sample()
    {
      printf("example");
    }
    
    int main(int argc, char *argv[])
    {
      sample();
      return 0;
    }
    
    我得到了以下结果:

    basicq.c:6:1: warning: control reaches end of non-void function [-Wreturn-type]
    }
    ^
    1 warning generated.
    
    这只是一个衰减,不是一个错误,所以程序确实编译并运行了。在这种情况下它是有效的,因为在非常简单的代码中,实际上没有使用应该返回的值,所以没有出现任何问题。但如果你真的尝试使用它,会发生什么?让我们看看。。。我将更改
    main()
    如下:

    #include <stdio.h>
    
    int sample()
    {
      printf("example");
    }
    
    int main(int argc, char *argv[])
    {
      int i = sample();
      printf("%d\n", i);
      return 0;
    }
    
    第一部分“示例”来自
    sample()
    ,而
    0
    来自
    main()
    中的
    printf()
    。为什么是零

    调用函数时,堆栈上会为返回值保留一些空间。被调用函数中的
    return
    语句通常用函数想要返回的任何值填充该空间。如果函数无法执行
    return
    语句,那么该空间仍然存在,调用方仍然可以读取,但无法知道其中可能包含什么。。。没有定义。这就是为什么你会收到警告。。。编译器告诉你“嘿,你说过你要返回一个值,但是你从来没有这样做过。”但是它仍然允许你这样做,因为C给了你能力去做各种实际上不是好主意的事情

    让我们换一种方式来尝试,既从void函数返回值,也从返回
    void
    的函数获取值:

    #include <stdio.h>
    
    void sample()
    {
      printf("example");
      return 1;
    }
    
    int main(int argc, char *argv[])
    {
      int i = sample();
      printf("%d\n", i);
      return 0;
    }
    

    这是因为
    void
    返回类型告诉编译器没有返回任何内容,因此没有为返回值保留空间,尝试写入或读取不存在的空间没有任何意义。。。编译器不知道如何生成该代码,因此在这两种情况下都会生成错误。

    这实际上取决于编译器及其功能。它可能导致未定义的行为。如果您有一个不返回值的函数,那么就不要这样声明它(将返回类型声明为
    void
    )。一般来说,不要编写没有意义的代码。一个好的编译器在第一个示例中会给你警告,在第二个示例中不会给你警告(假设第一部分实际上是
    main
    void sample()
    是正确的,
    int sample()
    不是,这是主要的区别。假设在您省略了名称的神秘函数之前,
    sample
    没有原型,一个好的编译器会在这两个方面向您发出警告,在第二个方面则会出现错误。第一个将警告您
    sample
    未声明,并假设返回
    int
    (确实如此,但编译器还不知道),然后再次警告您,因为
    sample
    缺少返回。第二个警告与第一个问题相同,但随后出现错误,因为编译之前的代码时,
    void sample()
    不再符合
    int sample()
    的隐式外部假设。我错过了你的第一个问题,这一点很好。但是,您确定这是编译器错误吗?我认为这是一个警告。@Yunnosch这不是一个编译器错误;这充其量只是一个警告,如果一个人明智地启用将所有警告视为其构建中的错误,那么它可能会成为一个错误(这是一条明智的建议,适用于所有人,无论是新的还是旧的,C)。@WhozCraig说得不错。我会接受“应该是错误的”,但我认为答案中应该明确。@Yunnosch我同意。老实说,如果没有一个合适的原型,我们甚至不知道OP是否有一个合适的原型,一个格式良好的
    main
    ,等等。所以我们都在这里。因此,为什么我的评估是在一般性评论中。我的错误,正如在另一个评论中提到的,不会有编译错误。
    example0
    
    #include <stdio.h>
    
    void sample()
    {
      printf("example");
      return 1;
    }
    
    int main(int argc, char *argv[])
    {
      int i = sample();
      printf("%d\n", i);
      return 0;
    }
    
    basicq.c:6:3: error: void function 'sample' should not return a value
          [-Wreturn-type]
      return 1;
      ^      ~
    basicq.c:11:7: error: initializing 'int' with an expression of incompatible type
          'void'
      int i = sample();
          ^   ~~~~~~~~
    2 errors generated.