2013-06-12 48 views
1

球員我是新的編程和我很驚訝的後增值的結果,現在我遇到了混亂後,我發現並執行下面的代碼,如果for循環說 1.初始化 2.檢查條件是否爲假終止 3.增量。 我在哪裏發生?我的價值在哪裏等於1?受到困惑,需要明確解釋後增量

int main() 
{ 
int i, j; 

for (int i =0; i<1; i++) 
{ 
    printf("Value of 'i' in inner loo[ is %d \n", i); 




    j=i; 
    printf("Value of 'i' in outter loop is %d \n", j); 
      // the value of j=i is equals to 0, why variable i didn't increment here? 
} 
    //note if i increments after the statement inside for loop runs, then why j=i is equals to 4226400? isn't spose to be 1 already? bcause the inside statements were done, then the incrementation process? where does i increments and become equals 1? 
    //if we have j=; and print j here 
//j=i; //the ouput of j in console is 4226400 
//when does i++ executes? or when does it becomes to i=1? 



return 0; 
} 

如果後增量使用該值並加1?我迷路了...請解釋...非常感謝你。

+0

你的代碼討論外部和內部循環,但是那裏只有一個循環。 –

+0

* 3。增量。我++在哪裏發生?*增量**是**「我++」意味着什麼,它發生在'for'循環的末尾 – tay10r

+0

請閱讀以下鏈接:http://msdn.microsoft.com/en-us/library /b80153d8(v=vs.71).aspx它可以準確解釋你對什麼感到困惑。 – Patashu

回答

2

我真的不知道你問什麼,但有時它的初學者更容易理解,如果寫成while循環:

int i = 0; 
while (i < 1) 
{ 
    ... 
    i++; // equivalent to "i = i + 1", in this case. 
} 
+0

這是一個有趣的陳述,我將你的while語句與我的for循環語句進行比較,然後i ++執行它放置的位置,如果它是for循環,它將等待,直到它重新進入for循環並執行增量而在變量i用於聲明後,它會進行增量... – user2474851

0
for (i=0; i<x; i++) 

是相當於

i=0; 
while(i<x) { 
    // body 
    i = i + 1; 
} 
1

您的循環聲明瞭新變量i,並且它影響main()中早些時候聲明的i。因此,如果在循環的外部將i指定爲j,則會調用未定義的行爲,因爲i未在該上下文中初始化。

+0

否,未定義,請參見附錄J.2「具有自動存儲持續時間的對象的值在不確定時使用(6.2.4,6.7.8, 6.8)。」 – dreamlax

+0

這是正確的。根據我的理解,只有在它再次重新進入for循環語句時,它纔會增加或執行任何增量過程,無論它是發佈還是預發佈......對嗎? – user2474851

+0

@dreamlax我的壞...刪除:) – Sebivor

1

在第一次迭代之前,i被初始化爲0。這就是你所說的「初始化」階段。

然後評估循環條件。循環繼續一個真正的價值。

然後執行循環體。如果有continue;語句,則會導致執行跳轉到循環結尾,即}之前。

然後評估增量運算符的副作用。

因此,它是第一次迭代後i更改爲1i保留整個第二次迭代的值1

1

它看起來像你有一個變量名衝突:i在循環之前,也在循環內部聲明。

for語句中聲明的i是唯一一個將是1的函數。它將是執行循環體後的一個。

嘗試設置一個斷點,並使用調試器在您觀察變量的值(這裏是我的意思是stepping with the debugger的意思是一個視頻)的同時循環遍歷循環。

以除去兩個變量稱爲的ambiguitity i你可以改變for循環:

for (i = 0; i < 1; i++) // remove the `int` 

這將確保只有一個i在你的代碼。

1

上@ CarlNorum的答案,也不會好看作爲註釋註釋:

C標準定義

for (A; B; C) STATEMENT 

的意思幾乎同樣的事情

{ 
    A; 
    while (B) { 
     STATEMENT 
     C; 
    } 
} 

(其中包含任意數量的語句的{}塊本身就是一種語句)。但for循環中的continue;語句將跳轉到下一個語句C;之前,而不是表達式B的下一個測試。