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

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需要引入数学库头文件
  • 缺失基础结构:代码没有写main函数入口,也没有引入stdio.h等必要头文件,本身就无法正常编译。
修正方案
  1. 补全必要头文件和main函数结构,初始化op变量避免初始值随机
  2. 读操作符的scanf中在%c前加空格,自动跳过缓冲区里残留的换行、空格等空白字符
  3. 修正所有运算逻辑:平方直接用n*n实现,开方用sqrt()函数,除法时先把整数转成float避免整数截断,三角函数做角度转弧度处理
  4. 修正printf传参,去掉ans前面的取地址符&
  5. 输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:27:09