2013-06-29 168 views
0

下面的代碼是我寫的,用於測試我對使用for-loopfor-loop的理解,特別是使用for-loop中的賦值語句。但是在這裏我得到了意想不到的輸出爲什麼它不將0分配給array的前10個元素?
如果我聲明陣列爲array[10]而不是array[11],爲什麼不打印array
有人可以解釋嗎?for循環內部的賦值語句

#include <stdio.h> 

int main() { 
    int i, array[11]; //array[10] 
    for (i = 0; ((i < 10) || (array[i] = 0)); ++i); 
    for (i = 0; ((i < 10) && (printf("%d\n", array[i]))); ++i); 
    return 0; 
} 

回答

3

兩個問題都在這條線:

int for (i = 0; ((i < 10) || (array[i] = 0)); ++i); 

首先,程序需要評估((i < 10) || (array[i] = 0))。在前10次迭代中滿足條件(i < 10)(不是0),程序不需要來評估array[i] = 0以知道整個表達式是真實的,所以它根本不執行第二部分並且分配沒有完成。

第一10次迭代之後,當i變得10(i < 10)不再是真實的,則程序最後assignes 0array[i]但它是array[10] - 的array第十一元件。當數組只有十個元素時,分配會使程序崩潰。

+0

但是,爲什麼第二個'for-loop'甚至沒有'printf'垃圾值? – noufal

+0

它應該打印垃圾,至少當數組大小爲11(在VS2010中檢查)時。如果數組大小爲10,那麼程序可能會在打印前分配時崩潰,尤其是在某些調試配置(使用數組綁定檢查)編譯時。 –

+0

感謝您的完整答案。 – noufal

0

要分配零簡單的方法去是使用:

int array[11] = {0}; 

在循環中,(我< 10)得到TRUE,所以它不會繼續(數組[我] = 0)

可以更換:

((i < 10) || (array[i] = 0)) 

與此

((i < 10) | (array[i] = 0)) 

它會強制評估右側,即使左側是真實的。

但是,當變量我會得到值10,它會繼續,並做arr [10] = 0 ... 所以,如果你想你的數組大小爲10,這可能是一個問題。

+3

沒有,轉讓是完全有意。 – dasblinkenlight

+0

我正在嘗試用'0'填充數組。它不是一個有條件的陳述。 – noufal

6
((i < 10) || (array[i] = 0)) 

||是懶,只要i < 10,表達將short circuit和分配甚至不會被評估。

改變循環的顯而易見的方法是:

for (i = 0; i < 10; ++i) 
    array[i] = 0; 

...這是更具可讀性,並確實做你想做的事情。

+2

如果你真的不想使用'for'循環體(無論什麼原因),你可以在'for':'的第三部分使用逗號運算符(for i = 0; i < 10; array [i] = 0,++ i);' – Kninnug

+0

@Kninnug +1給我一個新的信息... – noufal

3

當它檢查(i < 10) || (array[i] = 0)它短路。由於我不到10歲,所以從來沒有這樣做 - 聲明將是真實的,而i<10

0

這是因爲編譯器優化。當編譯器評估||(邏輯或)時,首先檢查左側值是true還是false。如果左側值爲true,則不執行右側值。在你的代碼中,直到我變成10它不計算數組[i] = 0;

如果您希望使其適用於i的每個值,則可以降低編譯器的優化級別。

+0

它不是「編譯器優化」,而是強制性的語言規則 –

2
for (i = 0; ((i < 10) || (array[i] = 0)); ++i); 

這個循環檢查我是否是對小於10或不bt後不等於10,這樣你們就需要在那裏添加aditional的邏輯算子的價值,

for (i = 0; ((i <= 10) || (array[i] = 0)); ++i);