C 在子程序中使用/不使用return有什么区别?

C 在子程序中使用/不使用return有什么区别?,c,function,functional-programming,return,return-value,C,Function,Functional Programming,Return,Return Value,第二段代码没有给出正确的值,因为它只传递我看到的r的值。但是,我希望在不使用return的情况下使此代码正常工作(只是为了学习如何以其他方式执行此操作)。此外,这两个选项之间的最佳实践是什么?谢谢!:-) #包括 #定义PI 3.1416 浮动区(浮动r); 内部主(空) { 浮点数r=10; printf(“面积:%.2f”,面积(r)); 返回0; } 浮动区(浮动r){ 返回PI*r*r; } #包括 #定义PI 3.1416 浮动区(浮动r); 内部主(空) { 浮点数r=10; pr

第二段代码没有给出正确的值,因为它只传递我看到的
r
的值。但是,我希望在不使用
return
的情况下使此代码正常工作(只是为了学习如何以其他方式执行此操作)。此外,这两个选项之间的最佳实践是什么?谢谢!:-)

#包括
#定义PI 3.1416
浮动区(浮动r);
内部主(空)
{
浮点数r=10;
printf(“面积:%.2f”,面积(r));
返回0;
}
浮动区(浮动r){
返回PI*r*r;
}
#包括
#定义PI 3.1416
浮动区(浮动r);
内部主(空)
{
浮点数r=10;
printf(“面积:%.2f”,面积(r));
返回0;
}
浮动区(浮动r){
PI*r*r;
}
我想让这段代码在不使用return的情况下工作(只是为了学习如何以另一种方式工作)

使用
return
是从函数实际返回值的唯一方法


但是,C语法提供了两个备选选项:

  • 可以将另一个指针作为参数传递给函数,该函数指向调用者中的对象,然后在其中指定表达式的值
  • 例如:

    #include <stdio.h>
    
    #define PI 3.1416
    
    void area(float r, float *p);
    
    int main(void)
    {
      float r = 10;
      float s;
      area(r, &s);
      printf("Area: %.2f", s);
      return 0;
    }
    
    void area(float r, float* p) {
       *p = PI * r * r;
       return;
    }
    
    #include <stdio.h>
    
    #define PI 3.1416
    
    float s;
    
    void area(float r);
    
    int main(void)
    {
      float r = 10;
      area(r);
      printf("Area: %.2f", s);
      return 0;
    }
    
    void area(float r) {
        s = PI * r * r;
        return;
    }
    
    #包括
    #定义PI 3.1416
    空隙区域(浮子r、浮子*p);
    内部主(空)
    {
    浮点数r=10;
    浮子;
    区域(r&s);
    printf(“面积:%.2f”,s);
    返回0;
    }
    空隙区域(浮子r、浮子*p){
    *p=PI*r*r;
    回来
    }
    

  • 也可以定义全局对象,并将表达式的值指定给该全局对象 例如:

    #include <stdio.h>
    
    #define PI 3.1416
    
    void area(float r, float *p);
    
    int main(void)
    {
      float r = 10;
      float s;
      area(r, &s);
      printf("Area: %.2f", s);
      return 0;
    }
    
    void area(float r, float* p) {
       *p = PI * r * r;
       return;
    }
    
    #include <stdio.h>
    
    #define PI 3.1416
    
    float s;
    
    void area(float r);
    
    int main(void)
    {
      float r = 10;
      area(r);
      printf("Area: %.2f", s);
      return 0;
    }
    
    void area(float r) {
        s = PI * r * r;
        return;
    }
    
    #包括
    #定义PI 3.1416
    浮子;
    空隙面积(r);
    内部主(空)
    {
    浮点数r=10;
    面积(r);
    printf(“面积:%.2f”,s);
    返回0;
    }
    空隙区域(浮动r){
    s=PI*r*r;
    回来
    }
    
    但这被认为是一种不好的做法,因为与使用参数和返回类型相比,函数之间和函数之间的连接以及函数的实际使用更难理解,而参数和返回类型则显示了特定函数调用的关系和使用非常好

    如果可能,应避免使用全局对象,尽管在某些情况下全局对象是合适的,如果您在多个功能中使用一个对象,并且该对象的角色是精确定义的。但在您提供的示例中,全局对象不太适合,应该避免



    如果不应返回任何值,请将函数的返回类型定义为类型
    void

    没有其他方法。您需要使用
    return
    语句返回一个值。如果没有它(在您的第二个选项中),它将是一个空语句,不起任何作用,函数将引发编译器错误或返回0(基于您的编译器)。我很好奇您在哪里听说过这种“其他方式”,因为要么源代码完全错误,或者您误解了什么。因为您使用了FP标记:没有return语句的函数在语义上将函数调用表达式转换为语句。您需要全局可变状态才能以有意义的方式使用此函数,就像您需要任何语句的全局状态才能将其与其他语句连接一样。您确定返回的函数必须是
    void
    ?整个标准中有多个示例省略了返回,第6.8.6.4节仅规定“没有表达式的返回语句只能出现在返回类型为void的函数中。”和“函数可以有任意数量的返回语句”,这对我来说意味着
    返回
    在这样一个函数中当然是合法的,但不是严格要求的(毕竟,“任意数字”大概包括0)非常感谢您的全面回答@RobertS supports Monica Cellio:-)在本文中的三个选项之间,哪一个被认为是最佳实践,为什么?我猜根据您的回答,主要是在使用指针或返回值本身之间(在这种特殊情况下,我们放弃使用全局对象)。谢谢大家!@正如RobertS已经提到的,使用全局变量被认为是不好的做法,但有一个显著的例外,那就是
    errno
    。有许多标准函数,如果出现问题,它们会将错误原因写入errno,以便用户可以在事后进行检查。除此之外,您应该尽量减少全局变量的使用(特别是当它只是为了“返回”一个值时),因为它使代码更难读取和维护。其他两个选项都是经常使用的,选择哪一个取决于具体情况。C标准不需要具有非void返回类型的函数来执行
    return
    语句。如果函数没有执行
    返回
    ,并且使用了函数的值,那么它就不会定义行为。(这适用于根据参数执行不同操作的函数,例如设置或获取某些配置设置的请求。)返回类型为
    void
    的函数不需要执行
    return
    语句。对于一个函数
    f
    ,它具有非无效返回类型,但不执行
    return
    ,而是通过流到其末尾返回,然后
    f()正常,但
    x=f()不可用。