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

使用GOTO实现的简易计算器函数是否正确?如何返回NaN?

问题分析与解决方案

原函数的问题

你这个用GOTO实现的计算器函数存在明显逻辑错误:

  • 当传入的op不是+、-、*、/时,程序会直接顺序执行到add标签,强制做加法运算,完全不符合预期。
  • 除法分支没处理除数num2为0的情况,会触发浮点数除以0的未定义行为(通常得到无穷大,这不是合理的计算结果)。

修复方案

1. 处理非法运算符返回NaN

在C里,要返回NaN可以用<math.h>头文件提供的NAN宏。我们需要在所有运算符判断之后,加一个分支专门处理非法op,把结果设为NAN再跳转到结束标签。

2. 修复除法除数为0的问题

在除法分支里先判断num2是否为0,如果是直接返回NAN,避免未定义行为。

修改后的完整代码

#include <math.h> // 必须包含这个头文件才能使用NAN宏

float calcu(float num1, float num2, char op){
    float R;

    if (op == '+') goto add;
    if (op == '-') goto sou;
    if (op == '*') goto mult;
    if (op == '/') goto div;

    // 处理非法运算符的情况
    R = NAN;
    goto end;

add:
    R = num1 + num2;
    goto end;

sou:
    R = num1 - num2;
    goto end;

mult:
    R = num1 * num2;
    goto end;

div:
    // 处理除数为0的异常情况
    if (num2 == 0.0f) {
        R = NAN;
    } else {
        R = num1 / num2;
    }
    goto end;

end:
    return R;
}

额外说明

如果你的编译器不支持NAN宏,也可以手动构造NaN值:R = 0.0f / 0.0f;,这会生成一个标准的NaN浮点数。

内容的提问来源于stack exchange,提问作者Abdelhak Mez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:30:55