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()代码>不可用。