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

C语言for循环计算double-pass方差结果异常、循环未迭代问题求助

问题原因

  • for 循环未添加花括号,仅紧随循环的第一条语句会被纳入循环体。你写的printf不在循环范围内,所以只会在循环全部结束后执行一次,自然只能看到一次输出。
  • 循环边界逻辑错误,触发数组越界访问。你的数组长度为5,合法下标范围是0~4,但你设置的循环条件是i <= size_f(size_f值为5),循环会执行6次:
    • 当i=0时,你访问了arr_f[i-1]即arr_f[-1],属于读取数组边界外的非法内存,会拿到未知的脏值
    • 多出来的迭代加上脏值直接导致求和结果完全错误
  • 数组长度不应该用float类型存储,应该用整型(如int、size_t),浮点数用于循环判断存在精度异常的隐患。

修正后的代码

#include <stdlib.h>
#include <math.h>
#include <stdio.h>

int main(void) {
    float arr_f[5] = {25924.12, 25924.15, 25923.98, 25924.19, 25923.89};
    // 数组长度用int存储
    int size_f = sizeof(arr_f)/sizeof(*arr_f);
    float sum_f = 0.0;
    // 循环边界改为i < size_f,同时修改数组下标为i,避免越界
    for (int i = 0; i < size_f; i++)
        sum_f += arr_f[i];
    
    float mean_f = sum_f/size_f;

    float sum_v_f_double = 0.0;
    for (int i = 0; i < size_f; i++) {
        sum_v_f_double += (arr_f[i]-mean_f)*(arr_f[i]-mean_f);
        // 加花括号后printf属于循环体,每次迭代都会打印
        printf("%f\n", sum_v_f_double);
    }

    float var_f_double = (1./(size_f-1.))*sum_v_f_double;
    printf("计算得到的方差为:%f\n", var_f_double);
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:39:00