2017-04-12 66 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