C语言使用while与if编写简易计算器结果恒为0.0000问题求助
代码存在的核心问题
- 输出语句传参错误:
printf("%f\n",&ans);中错把变量ans的内存地址传给了%f格式符,浮点数格式要求传入值本身,传入地址会被解析为错误的浮点数,这是始终输出0.0000的直接原因。 - 变量未初始化就参与判断:循环判断条件
while(op!='q')执行时,局部变量op还未被赋值,是随机的垃圾值,会导致循环逻辑完全不可控。 scanf读字符时会读入残留换行:每次输入数字、操作符后敲的回车符(换行符)会残留在输入缓冲区,被后续的%c格式读入,被识别为无效操作符,直接跳过运算逻辑。- 运算符逻辑完全错误:
- C语言中
^是按位异或运算符,不是数学上的幂运算,不能用来算平方、开方 - 表达式
1/2是整数除法,运算结果为0,完全达不到开平方的效果 - 两个int类型变量直接做除法是整数截断除法,比如5/2结果是2而不是2.5,会丢失精度
sin/cos函数的入参要求是弧度值,直接传入角度整数会得到完全错误的结果,且使用这两个函数、开方函数sqrt需要引入数学库头文件
- C语言中
- 缺失基础结构:代码没有写
main函数入口,也没有引入stdio.h等必要头文件,本身就无法正常编译。
修正方案
- 补全必要头文件和main函数结构,初始化
op变量避免初始值随机 - 读操作符的
scanf中在%c前加空格,自动跳过缓冲区里残留的换行、空格等空白字符 - 修正所有运算逻辑:平方直接用
n*n实现,开方用sqrt()函数,除法时先把整数转成float避免整数截断,三角函数做角度转弧度处理 - 修正printf传参,去掉
ans前面的取地址符& - 输入q的时候直接退出循环,不要执行后续输出逻辑
修正后的可运行代码:
#include <stdio.h> #include <math.h> int main() { char op = 0; // 初始化操作符变量,避免初始随机值 int n1; int n2; float ans; int n; while(op != 'q'){ // %c前加空格,跳过所有残留的空白字符(换行、空格等) scanf(" %c", &op); // 输入q直接跳出循环,不执行后续运算输出 if (op == 'q') break; if (op=='a'||op=='s'||op=='m'||op=='d'){ printf("Enter first number\n"); scanf("%d",&n1); printf("Enter second number\n"); scanf("%d",&n2); if (op=='a'){ans = n1 + n2;} else if(op=='s'){ans = n1 - n2;} else if(op=='m'){ans = n1 * n2;} else if(op=='d'){ // 强转float避免整数除法截断 ans = (float)n1 / n2; } } else if(op=='p'||op=='r'||op=='n'||op=='c'){ printf("Enter number\n"); scanf("%d",&n); if (op=='p'){ans = n * n;} // 平方直接相乘,不用异或 else if(op=='r'){ans = sqrt(n);} // 开方用sqrt函数 else if(op=='n'){ans = sin(n * M_PI / 180);} // 角度转弧度 else if(op=='c'){ans = cos(n * M_PI / 180);} // 角度转弧度 } else { printf("Invalid operator, valid ops: a(加)/s(减)/m(乘)/d(除)/p(平方)/r(开方)/n(正弦)/c(余弦)/q(退出)\n"); continue; } printf("result: %f\n", ans); // 去掉&,直接传ans的值 } return 0; }
如果用GCC编译上述代码,需要在编译命令末尾加-lm参数链接数学库,否则会报三角函数、sqrt函数的链接错误。代码内置操作符对应逻辑:a是加、s是减、m是乘、d是除、p是平方、r是开平方、n是求角度正弦值、c是求角度余弦值、q是退出程序。
内容的提问来源于stack exchange,提问作者chami
相关产品推荐
相关产品推荐

