使用GDB调试正常但VSCode异常:C语言正数平均值计算结果过小
C语言计算正数平均值结果异常的修复
问题描述
以下代码用于计算数组中正数的平均值,在GDB调试中运行正常,但在VSCode中运行时结果数值过小:
#include <stdio.h> #define size 100 int main(){ int peppe[size],n,i,j; float somma; do { printf("Inserisci il numero di elementi: "); scanf("%d", &n); } while (n <= 0 || n > size); for(i=0; i<n; i++) { printf("Inserisci il valore %d: ", i); scanf("%d", &peppe[i]); } for(i=0; i<n; i++){ if(peppe[i]>=0){ somma += peppe[i]; j++; } } printf( "La media dei valori positivi è: %.2lf", somma/j ); return 0; }
VSCode运行输出示例:
Inserisci il numero di elementi: 5 Inserisci il valore 0: 3 Inserisci il valore 1: 4 Inserisci il valore 2: 5 Inserisci il valore 3: -8 Inserisci il valore 4: -7 La media dei valori positivi è: 1.09
问题根源
代码存在未定义行为:局部变量somma和j没有初始化。C语言中,栈上的局部变量默认不会被初始化为0,会保留栈空间中的随机垃圾值。
- GDB调试时,栈空间可能被调试环境清零,恰好
somma和j的初始值为0,所以计算结果正确; - VSCode的编译运行环境中,这两个变量的初始值是随机的小数值,导致累加后的
somma依旧很小,除以随机的j值后得到错误的偏小结果。
修复后的代码
只需将somma和j初始化为0,同时添加无正数时的异常处理:
#include <stdio.h> #define size 100 int main(){ int peppe[size],n,i,j = 0; // 初始化计数变量j为0 float somma = 0.0f; // 初始化累加变量somma为0.0f do { printf("Inserisci il numero di elementi: "); scanf("%d", &n); } while (n <= 0 || n > size); for(i=0; i<n; i++) { printf("Inserisci il valore %d: ", i); scanf("%d", &peppe[i]); } for(i=0; i<n; i++){ if(peppe[i]>=0){ somma += peppe[i]; j++; } } // 处理无正数的情况,避免除以0错误 if(j == 0){ printf("Non ci sono valori positivi.\n"); } else { printf( "La media dei valori positivi è: %.2lf", somma/j ); } return 0; }
内容的提问来源于stack exchange,提问作者Adriano Borrelli
相关产品推荐
相关产品推荐

