2013-02-28 41 views

回答

3

好消息:在您的實現,char簽字!

此外,發生的是i的值從127溢出到-128,因爲127是符合簽名char的最大正值。

編輯:其實,我不知道的char在你執行的符號性,但循環完全打破:

這也許應該是

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

但是這只是一個猜測。這很難解釋。

2

一個char是在你的編譯器有符號的8位整數。它可以表示-128到+127的值。循環結束條件爲++i,並在C中的所有非零值被認爲是真實的,所以它會循環直到++i爲零時i-1這會發生。

的原因,如果順利從127到-128是因爲如何有符號整數在電腦前工作。 127的二進制位是01111111,-128的位模式是1000000。向01111111添加一個將導致10000000

總而言之,你for循環是沒有真正意義上的。它在語法上是正確的,但沒有任何意義。爲了說明如何for循環的作品看答案由Dan F.

14

那一定是我所見過的在我的生命中最畸形的for循環。對於循環被格式化爲在for循環的開頭如下

for (initalization; condition; update) 

,發生initialization。這通常是像i = 0。在每個循環的頂部,condition(通常像i < 5)爲了看循環是否應該繼續進行評估,並應循環繼續,update執行(再次,通常像++i),並循環執行一次。

請告訴我這裏發生,是循環使用++i作爲條件,所以當++i計算結果爲0值只會終止,於是你開始在1和增量,直到char i溢出從128-127,然後繼續遞增,直到它到達-1,在該點++i計算結果爲0,循環終止

EDIT

因此,根據你的代碼,i<=5 && i>=-1在循環的第一次迭代的最開始時執行(這完成完全沒有),然後++i被評估爲布爾狀態(其爲0開始,並且使用預增量評估是1,因此,而不是0所以布爾通過),然後執行i>0update部分,它再次不執行任何操作。

EDIT2

如果你的問題是真的,爲什麼它會1,2....128,-127,-126....-1然後勒夫提供了行爲的一個很好的解釋

+0

花時間來解釋....不錯1 – 2013-02-28 14:28:59

+0

哈,沒有注意到。是的,這是一個非常糟糕的循環。 – 2013-02-28 14:30:25

+0

@WillihamTotland是這種情況嗎? '我<=5 && i> = -1' – 2013-02-28 14:31:09

1

的程序解釋「我」在打印時爲8位有符號整數,意味着一位符號,七位數據。這給你一個範圍-128到127的有效值。

「for」循環preincrements i在printf之前,因此給它的第一遍值爲1,並且遞增一直持續到i + 1 = 128 - 它將符號位翻轉爲有符號整數,然後運行循環直到++我導致i爲0.

1

順便說一下,for循環是可怕的。你知道它應該是for(intialisation; end condition; increment),對吧?

無論如何。我初始化爲0;第一個圍繞for循環測試具有預增量的結束條件(++ i)。所以我增加到1,循環運行打印1.

現在重複。每個循環爲i打印一個更高的值,因爲結束條件測試是預先遞增的。

最終我達到127;它然後增加到128,但你打印它爲「%d」期待一個有符號的整數,所以使用二進制補碼將其解釋爲-128。

增量然後一直延續到255(打印爲-1)。下一個預增量會導致溢出,所以我再次變爲0,此時「結束條件測試」計算結果爲false,循環停止。

1

這個程序有很奇怪的用於循環。 你通過檢查它們初始化你的循環變量「i < = 5 & & i> = - 1」 - 沒有完成任務。 循環期間評估條件「++ i」,這是真實的,直到i = -1;並在增量步驟中檢查數字是否大於零。

你做實際上:

for(i = 1; i != 0; i++) 
{ 
    printf("%d\t",i); 
} 

溢出以上127你從1到127的數字和從-128到-1。