2017-04-12 28 views
0

我试图用7个元素打印float数组的值。我只分配了3个值,它们属于float,double和integer。解释与printf相关的c程序的结果值

代码:

#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

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

+1

您还没有分配您的阵列为任意值。这就是为什么在任何分配之前它都是填充**垃圾**值的原因。 – kuro

+1

也许'float array [7] = {0};'会为您提供更多可预测的结果,并防止发生**未定义行为**,当您尝试访问阵列中未初始化的元素**时, [3]'。如果初始化数组的所有元素,则可以遍历整个数组而不调用未定义的行为,如果未能初始化数组,则必须将迭代次数限制为仅数组中的前三个已定义元素。 –

+1

注:本声明:float f = 3.24;将一个'double'文字赋值给一个'float'变量。为了纠正产生'float'文字,文字的最后一个字符必须是'f' I.E. 'float f = 3.24f;' – user3629249

回答

4

最后的值在C中被称为垃圾值。 如果您没有在C中显式初始化变量,那么它的值可能是任何东西,然后才能为其明确指定某些内容。这可能是垃圾;语言标准没有具体说明它应该是什么。

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

2

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

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

因此,当您声明一个包含7个项目的数组时,C编译器会标记一个内存区域以容纳这些项目(在这种情况下,类型为float)。但它并没有真正检查内存区域包含的内容,除非您明确指定值。在你的情况下,最后四个值(你自己还没有分配)只是垃圾留在标记为你阵列的内存区域。

再次,编译器清晰的记忆,当你声明数组,它只是标志着记忆的区域。您有责任为数组分配默认值。

你可能的解决方案是手动初始化所​​有的数组的一些默认值的元素(例如,0),像这样:

float array[7] = {0} 
+0

谢谢大卫,只是将它附加到答案上! – SimpleBeat

+0

谢谢您的明确答案,是否有任何理由具有诸如“-1。#R”和“0.00”之类的值?我在问,因为这两个值不同于“96627196995476105000000000000000.00”和“96629547147269436000000000000000.00” –

+0

谢谢!没有任何理由!它恰好发生在你的机器上,你已经为你的数组标记了内存区域,并且没有用默认值包含一些编译器解释为这些数字的位。 – SimpleBeat