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

C语言递归求和偶数程序输入-1后出现异常大值的问题咨询

C语言递归求和偶数程序输入-1后出现异常大值的问题咨询

嘿,我来帮你拆解下这个问题~

首先,咱们先揪出两个核心问题,正是它们导致了你看到的异常大值:

1. 用无符号类型size_t接收负数输入的隐患

size_t是无符号整数类型,它的取值范围从0开始,根本存不了负数。当你输入-1并通过%zu格式符读取到size_t变量时,这属于C标准里的「无效输入」,行为是未定义的。虽然在很多编译器里,会把-1转换成size_t的最大值(比如64位系统上是18446744073709551615),但这不是标准规定的,完全看编译器心情。

你觉得基条件正常工作,是因为if (inpNum == -1)里的-1会被隐式转换成size_t类型的最大值,刚好和变量里的转换后的值相等,所以触发了返回0的逻辑——但这只是巧合,不是可靠的行为。

2. 全局变量inpNum的坑

你把inpNum定义成了全局变量,这意味着所有递归调用共享同一个变量值。比如:

  • 假设你先输入一个偶数10,此时inpNum=10,程序进入递归调用;
  • 接下来输入-1,inpNum被覆盖成size_t最大值;
  • 虽然基条件触发返回0,但如果scanf读取-1失败(比如输入格式不对),inpNum会保留之前的数值,导致递归不断累加这个值,最终得到一个超大的总和。

怎么修复?

给你改好了代码,咱们一步步解决问题:

#include <stdio.h>

int sumEven()
{
    // 把inpNum改成局部变量,每个递归调用都有自己的副本,不会被覆盖
    int inpNum;
    printf("Enter the seq: ");
    
    // 检查scanf的返回值,确保输入读取成功,避免无效输入导致的问题
    if (scanf("%d", &inpNum) != 1) {
        printf("Invalid input! Terminating...\n");
        return 0;
    }

    if (inpNum == -1) {
        printf("Base condition: %d\n", inpNum);
        return 0;
    } else if (inpNum % 2 == 0) {
        printf("EvenNumber: %d\n", inpNum);
        return inpNum + sumEven();
    } else {
        return sumEven();
    }
}

int main()
{
    printf("The sum of all even numbers: %d\n", sumEven());
    return 0;
}

关键修改点:

  • 用int代替size_t存储输入:int是有符号类型,可以正确接收-1作为终止条件,不会出现无符号转换的奇怪问题;
  • 将inpNum改为局部变量:每个递归调用都拥有独立的变量副本,彻底避免了全局变量被覆盖的风险;
  • 新增scanf返回值检查:当输入无效(比如输入字母、符号)时,程序会提示并终止递归,防止无限循环或未定义行为。

再解释下你原代码的大值来源:

在原代码中,如果scanf成功把-1转换成size_t最大值,虽然基条件会触发,但如果之前输入过偶数,理论上总和应该是正常的——但如果scanf读取-1失败(比如输入时不小心多打了符号),inpNum会保留之前的某个大数值,递归调用会不断累加这个值,最终就会输出一个异常大的总和。

备注:内容来源于stack exchange,提问作者Nalan PandiKumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 06:58:13