为什么有些函数需要return result
而有些不需要?
这里是一个程序来计算单利,其中第一个函数simpleInterest()
中没有return
:
double simpleInterest(double principal, double time, double rate) {
double result = ( principal * time * rate) / 100;
}
int main() {
// take input for principal, time, and rate
double principal, time, rate;
scanf("%lf %lf %lf", &principal, &time, &rate);
// call simpleInterest() with arguments: principal, time and rate
double interest = simpleInterest(principal, time, rate);
// print simple interest
printf("%.2lf", interest);
return 0;
}
这里是一个程序来计算一个圆的面积,在第一个函数computeArea()
中需要有一个return result
:
double computeArea( double radius, double pi) {
double result = pi * radius * radius;
return result;
}
int main() {
double pi = 3.14;
// get input value for radius
double radius;
scanf("%lf", &radius);
// call computeArea() with arguments radius and pi
double area = computeArea(radius, pi);
// print returned value up to 2 decimal points
printf("%.2lf", area);
return 0;
}
为什么两者都可以工作,但一个需要return
,另一个不需要?
1条答案
按热度按时间e1xvtsh31#
如果调用例程使用了被调用函数的返回值,但被调用函数返回是因为程序控制流到其关闭
}
(因此没有执行return
value;
语句),则程序的行为不是由C标准定义的。各种行为都是可能的,包括程序崩溃或以各种方式“行为不端”。一种可能的行为是将调用函数中最后计算的值用作返回值。这可能是因为处理器寄存器的使用方式:
double result = ( principal * time * rate) / 100;
是函数中的唯一代码,编译器可能会使用指定的返回值寄存器来计算( principal * time * rate) / 100
。然后,当函数返回时,计算出的值被留在返回值寄存器中,作为寄存器被用来计算值的事实的伪像,而不是通过使用它来返回值的设计。因此,调用例程将获得您希望它获得的值,即使缺少return
语句。虽然这种行为并不罕见,但它是脆弱的。如果在编译时启用了优化,编译器可能根本不会生成计算
( principal * time * rate) / 100
的指令,因为该表达式对C标准定义的程序语义没有影响。当你运行通过优化编译生成的程序时,它的行为不会像你想要的值从函数返回一样。