You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在main()中递归调用自身是否会生成重复变量?该写法规范吗?

#include <stdio.h>

int main(){
    int num1, num2;
    char op;
    float answer;
    
    printf("This is a simple calculator. Input '0q0' to quit.\n");
    printf("Enter the arithmatic operation ('num1''op''num2'): ");
    scanf("%d%c%d", &num1, &op, &num2);
    
    switch(op){
        case '+' : answer = num1 + num2;
            break;
        case '-' : answer = num1 - num2;
            break;
        case '*' : answer = num1 * num2;
            break;
        case '/' : answer = (float)num1 / num2;
            break;
        case 'q' : return 0;
            break;
        default: printf("Invalid Operand");
            break;
    }
    
    printf("Answer is : %.2f", answer);
    fflush(stdin);
    main();
}
问题1:这种在main()末尾调用自身实现循环的写法是良好实践还是不良实践?

这属于不良实践,核心原因如下:

  • 栈溢出风险:每次调用main()都会在栈内存中生成新的栈帧,循环次数过多会直接耗尽栈空间,导致程序崩溃;而while循环是原地迭代,不会持续占用新栈空间。
  • 可读性差:递归调用main做循环完全不符合常规代码逻辑,其他开发者阅读时会产生困惑,代码意图表达模糊。
  • 调试难度高:递归产生的栈帧会层层叠加,调试时查看调用栈会非常繁琐,排查问题的成本大幅提升。
  • 违背设计初衷:main作为程序入口,C标准虽未禁止递归调用它,但这并非其设计用途,常规场景下main只会被操作系统调用一次。
问题2:再次调用main()时,会复用旧变量还是创建新变量?

每次调用main()都会创建全新的局部变量,之前的变量会保留在栈的旧栈帧中,不会被复用。也就是说每循环一次,栈上就会新增一组num1、num2、op、answer的存储空间,直到栈被撑爆。

问题3:针对使用大量结构体的大学项目,这种写法的影响?

如果项目需要创建200-500个含13个变量的结构体,这种写法绝对不可行:

  • 内存消耗爆炸:每次递归都会在栈上新增所有局部变量(包括结构体)的存储空间,栈的大小通常仅几MB,很快就会触发栈溢出导致程序崩溃。
  • 性能冗余:栈分配回收虽快,但大量递归调用会带来额外开销,效率远低于while循环的原地迭代。

正确的做法是用while循环实现程序循环逻辑,所有局部变量会在循环迭代中被复用,内存占用稳定,性能和可读性都更优。

内容的提问来源于stack exchange,提问作者Tharindu Siriwardhana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:00:59