C语言中执行函数后如何返回main函数?求解决方案
C语言计算器循环运行问题的解决办法
问题出在哪
- 不能直接调用
main():C标准明确禁止在用户代码里递归调用main,这属于未定义行为,你碰到的报错,是因为main函数在运算函数之后定义,编译器不知道main的存在。 - 函数声明顺序问题:如果把
main移到代码前面,运算函数还没定义,编译器找不到这些函数的声明,自然会报错。
正确的解决思路
最优方案:函数声明+循环替代递归调用
先在代码开头声明所有运算函数,让编译器提前知道这些函数的存在,然后在main里用循环实现程序重复运行,运算函数执行完直接返回,不用调用main。
修改后的完整代码:
#include <stdio.h> #include <conio.h> #include <cbm.h> // 提前声明所有运算函数,解决未定义报错 void addition(); void subtraction(); void multiplication(); void division(); int integer1; int integer2; int integer3; int option; char choice; void addition (){ integer3 = integer1 + integer2; printf("%d\n", integer3); integer1 = 0; integer2 = 0; integer3 = 0; // 直接返回,让main的循环继续 } void subtraction (){ integer3 = integer1 - integer2; printf("%d\n", integer3); integer1 = 0; integer2 = 0; integer3 = 0; } void multiplication (){ integer3 = integer1 * integer2; printf("%d\n", integer3); integer1 = 0; integer2 = 0; integer3 = 0; } void division (){ // 加个除数不为0的判断,防止程序崩溃 if(integer2 == 0){ printf("错误:除数不能为0\n"); return; } integer3 = integer1 / integer2; printf("%d\n", integer3); integer1 = 0; integer2 = 0; integer3 = 0; } int main() { // 用while(1)实现无限循环,直到用户选择退出 while(1){ printf("ADVANCED CALCULATOR VERSION 0.2\n"); printf("CALCULATOR OPTIONS ARE:\n"); printf("1. ADDITION\n"); printf("2. SUBTRACTION\n"); printf("3. MULTIPLICATION\n"); printf("4. DIVISION\n"); printf("5. ADVANCED OPERATIONS\n"); printf("6. 退出程序\n"); // 新增退出选项,让程序可以正常结束 printf("请选择操作选项:\n"); scanf("%d", &option); if (option == 1){ printf("输入第一个数:\n"); scanf("%d", &integer1); printf("输入第二个数:\n"); scanf("%d", &integer2); addition(); } else if (option == 2){ printf("输入第一个数:\n"); scanf("%d", &integer1); printf("输入第二个数:\n"); scanf("%d", &integer2); subtraction(); } else if (option == 3){ printf("输入第一个数:\n"); scanf("%d", &integer1); printf("输入第二个数:\n"); scanf("%d", &integer2); multiplication(); } else if (option == 4){ printf("输入第一个数:\n"); scanf("%d", &integer1); printf("输入第二个数:\n"); scanf("%d", &integer2); division(); } else if(option == 6){ printf("程序已退出\n"); break; // 跳出循环,结束程序 } else { printf("输入无效,请重新选择\n"); } } return 0; }
不推荐的方案:声明main后递归调用
虽然可以在运算函数前加int main();来解决未声明报错,但这种做法违反C标准,多次调用后会导致栈溢出,绝对不建议这么做。
额外提示
- 尽量避免全局变量:你现在用的
integer1等都是全局变量,容易引发意外错误,最好改成在函数间传递参数,比如void addition(int a, int b),调用时传入输入的数值。 - 完善输入检查:比如处理用户输入非数字的情况,还有除法时的除数判断,让程序更健壮。
内容的提问来源于stack exchange,提问作者Mr Buddyboi
相关产品推荐
相关产品推荐

