解释与printf相关的c程序的结果值

时间:2017-04-12 04:41:34

标签: c printf

我试图用7个元素打印float数组的值。我只分配了3个值,它们属于float,double和integer。

代码:

#include <stdio.h>
int main(){   
    float array [7];

    float f = 3.24;
    double d = 23.5;
    int i = 4;

    array[0] = f;
    array[1] = i;
    array[2] = d;

    int n = sizeof(array)/sizeof(float);
    printf("Number of Elements : %d \n\n\n",n);

    for(int j = 0; j < n ; j++){
        printf("%.2f ,",array[j]);
    }
    printf("\b ");

}

我得到如下输出: 元素数量:7

3.24,4.00,23.50,-1。#R,96627196995476105000000000000000.00,96629547147269436000000000000000.00,0.00

我想清楚我的代码是否正确?为什么最后四个值彼此不同。这些价值是什么?

2 个答案:

答案 0 :(得分:4)

最后一个值在C中称为垃圾值。 如果您没有在C中显式初始化变量,那么在您明确地为其赋值之前,它的值可能是任何值。这一切都可能是垃圾;语言标准没有规定它应该是什么。

您可以阅读此博客,了解C编译器如何决定垃圾值:http://blog.aditech.info/2008/02/how-c-compiler-decides-garbage-values.html

答案 1 :(得分:2)

首先
是的,您的代码是正确的(尽管在return 0函数的末尾添加了main()命令)。但是,它需要更具体,这将导致您的第二个问题。

第二
C是一种允许程序员做很多事情的语言,但它也需要程序员进行大量的手动编码。

因此,当您声明一个包含7个项目的数组时,C编译器会标记一个内存区域以容纳这些项目(在这种情况下为float类型)。但在显式分配值之前,它实际上并未检查该内存区域。在你的情况下,最后四个值(你自己没有分配)只是在为你的数组标记的内存区域中的垃圾。

再次,编译器在声明数组时 为您清除内存,它只标记内存区域。您有责任为数组指定默认值。

您可能的解决方案是手动将数组的所有元素初始化为某个默认值(例如,0),如下所示:

float array[7] = {0}