C语言 为什么有些函数有return,有些没有

pftdvrlh  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(115)

为什么有些函数需要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,另一个不需要?

e1xvtsh3

e1xvtsh31#

如果调用例程使用了被调用函数的返回值,但被调用函数返回是因为程序控制流到其关闭}(因此没有执行returnvalue;语句),则程序的行为不是由C标准定义的。
各种行为都是可能的,包括程序崩溃或以各种方式“行为不端”。一种可能的行为是将调用函数中最后计算的值用作返回值。这可能是因为处理器寄存器的使用方式:

  • 通常,为了实现从函数返回值,处理器寄存器之一被指定用于返回值。被调用的例程应该把要返回的值放在寄存器中,调用例程应该期望在该寄存器中找到返回值。
  • 编译器通常也会在被调用的例程中使用该寄存器进行计算。这是很自然的,因为寄存器的前一个值不需要保留,所以在函数返回之前,它可以用于任何用途。
  • 因此,如果double result = ( principal * time * rate) / 100;是函数中的唯一代码,编译器可能会使用指定的返回值寄存器来计算( principal * time * rate) / 100。然后,当函数返回时,计算出的值被留在返回值寄存器中,作为寄存器被用来计算值的事实的伪像,而不是通过使用它来返回值的设计。因此,调用例程将获得您希望它获得的值,即使缺少return语句。

虽然这种行为并不罕见,但它是脆弱的。如果在编译时启用了优化,编译器可能根本不会生成计算( principal * time * rate) / 100的指令,因为该表达式对C标准定义的程序语义没有影响。当你运行通过优化编译生成的程序时,它的行为不会像你想要的值从函数返回一样。

相关问题