2015-05-04 127 views
-1

我的代碼中有一個小問題,用於從一系列數字中找到最小值。當我初始化min = 0時,最小值變爲0.但是當我沒有初始化min時,答案是正確的!如何正確初始化「min」變量?

爲什麼會發生這種情況? Xcode告訴我我應該初始化min變量。

int a[20] = {0}; 
int max = 0; 
int min ; 
int sum = 0; 

srand((unsigned)time(NULL)); 

for (int i = 1; i <= 20; i++) { 
    a[i] = 100 + rand()%(200 - 100 + 1); 

    if (max < a[i]) { 
     max = a[i]; 
    } 
    printf("%d,%d\n",a[i],i); 

    if (min > a[i]) { 
     min = a[i]; 
    } 

    sum += a[i]; 
} 

printf("最大值:%d\n",max); 
printf("最小值:%d\n",min); 
printf("平均值:%d\n",sum/20); 
+1

你認爲'if(min> a [i])'是做什麼的?只需從'limits.h'初始化'min'到'INT_MAX',一切都可以正常工作。 –

回答

0

編譯器警告是因爲訪問未初始化變量的值會導致未定義的行爲。

的常見技術可以找到在一個數組的最小值是初始化min是陣列中的第一個元素,然後遍歷後續元素

min = a[0]; 
for (i = 1; i < 20; ++i)  /* assume 20 elements */ 
    if (a[i] < min) min = a[i]; 

這適用於所有的數字類型,可以是使用<運算符進行比較,而不必費力尋找超出數組中所有可能值的值。

要注意的另一件事是數組索引從零開始。因此,一個有20個元素的數組(如int a[20])的有效索引爲019。運行從120的循環 - 因此訪問a[1]a[20]會產生未定義的行爲,因爲a[20]不存在。

+0

謝謝,先生...我可以知道你的github嗎? – rectinajh

+0

沒有github。 – Peter

1

你必須有大量初始化min,否則0威力保持爲最小數量。

可以初始化min作爲

int min = INT_MAX; 

INT_MAX是可以通過int舉行的最大值(必須添加<limits.h>INT_MAX)。

如果你沒有用一個值初始化min,那麼它將有一個不確定的值,它可以是任何東西,所以使用它們的值之前總是初始化局部變量..

2

如果不初始化一個局部變量,它的值是不確定,並使用它將導致未定義的行爲

你應該做的是什麼初始化爲值,就像你初始化max值。使用<limits.h>頭文件中的INT_MAX


另外,如果你的變量不能爲負數,您應該使用unsigned int,並初始化minUINT_MAX

2

當我初始化min = 0,最小值原來作爲0

因爲在那種情況下,if (min > a[i])總是錯誤的。 Remeber,a[i]爲> = 100

但是,當我不初始化min,得到的答案是正確的!

如果你沒有初始化局部變量,它的值是不確定的,並且包含一些垃圾值(可能是很大的值)。所以,看似,你的邏輯工作,你是顯然得到權利答案。但是,使用未初始化的局部變量的值調用undefined behaviour

解決方案: 初始化min具有最大possbile值,INT_MAX存在於頭文件。