c - 为什么在c中打印这个 float 会导致错误的答案

标签 c

我正在学习 c,但无法通过 google 找到答案(也许我使用了错误的关键字)

无论如何,这是一个简单的程序,用于获取学生 2 个科目的平均成绩:

#include <stdio.h>
int main() {
    int grades[2][2] = {{90, 78}, {92, 83}};
    float avg1, avg2;
    avg1 = ( grades[1][1] + grades[2][1] ) / 2;
    avg2 = ( grades[2][1] + grades[2][2] ) / 2;
    printf("Average 1 is: %d \n", avg1);
    printf("Average 1 is: %f", avg1);
    return 0;
}

我期待 91 的答案。

%d 给我:250732472

%f 给我:16424.000000

为什么会发生这种情况?我在网上找到了一个解决方案,该解决方案使用 int 数据类型作为成绩数组,使用 float 作为平均值,并且他们的解决方案有效。

最佳答案

首先,您没有打印任何内容,因为每个 printf 调用中都缺少一个参数 - 与每个格式说明符匹配的值。

现在,如果您的代码如下所示,

avg1 = ( grades[1][1] + grades[2][1] ) / 2;
avg2 = ( grades[2][1] + grades[2][2] ) / 2;
printf("Average 1 is: %d\n", avg1);
printf("Average 2 is: %f\n", avg2);

那么你正在处理未定义的行为,这就是你的输出看起来很奇怪的原因。这是因为,在您的第一个 printf 调用中,您使用的是 %d - 这是整数的格式说明符。如果要打印浮点变量,无论是 32 (float) 还是 64(double) 位长,您应该使用说明符 %f.

您的代码还有另一个问题会导致未定义的行为:grades 的长度为 2 个元素,因此 [2] 索引超出范围。

关于c - 为什么在c中打印这个 float 会导致错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59492668/

相关文章:

C测试变量是否在只读部分

c - 为什么不释放内存是不好的做法?

c - C中的无序浮点比较

c - 这段代码有什么问题? http ://www. spoj.pl/problems/ARRAYSUB/

c - 将字符串连接到数组时内存泄漏

c++ - 如何让mini xml数据的呈现更具可读性?

c - *( (int *)ptr+1) 的含义

c - MongoDB 在 C 中使用 $or 检索记录

c - 如何正确解析算术表达式中的数字,区分正数和负数?

c - 释放多维数组 C