在下面的程序我不明白這個程序是如何工作的
#include<stdio.h>
int main()
{
char i=0;
for(i<=5 && i>=-1;++i;i>0)
printf("%d\t",i);
return 0;
}
「我」得到了從1到127,然後打印從-128到-1。
爲什麼會出現這種情況?
在下面的程序我不明白這個程序是如何工作的
#include<stdio.h>
int main()
{
char i=0;
for(i<=5 && i>=-1;++i;i>0)
printf("%d\t",i);
return 0;
}
「我」得到了從1到127,然後打印從-128到-1。
爲什麼會出現這種情況?
好消息:在您的實現,char
簽字!
此外,發生的是i
的值從127溢出到-128,因爲127是符合簽名char
的最大正值。
編輯:其實,我不知道的char
在你執行的符號性,但循環完全打破:
這也許應該是
for (i = 0; i <= 5; i++)
但是這只是一個猜測。這很難解釋。
一個char
是在你的編譯器有符號的8位整數。它可以表示-128到+127的值。循環結束條件爲++i
,並在C中的所有非零值被認爲是真實的,所以它會循環直到++i
爲零時i
是-1
這會發生。
的原因,如果順利從127到-128是因爲如何有符號整數在電腦前工作。 127的二進制位是01111111
,-128的位模式是1000000
。向01111111
添加一個將導致10000000
。
總而言之,你for
循環是沒有真正意義上的。它在語法上是正確的,但沒有任何意義。爲了說明如何for循環的作品看答案由Dan F.
那一定是我所見過的在我的生命中最畸形的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>0
的update
部分,它再次不執行任何操作。
EDIT2
如果你的問題是真的,爲什麼它會1,2....128,-127,-126....-1
然後勒夫提供了行爲的一個很好的解釋
花時間來解釋....不錯1 – 2013-02-28 14:28:59
哈,沒有注意到。是的,這是一個非常糟糕的循環。 – 2013-02-28 14:30:25
@WillihamTotland是這種情況嗎? '我<=5 && i> = -1' – 2013-02-28 14:31:09
的程序解釋「我」在打印時爲8位有符號整數,意味着一位符號,七位數據。這給你一個範圍-128到127的有效值。
「for」循環preincrements i在printf之前,因此給它的第一遍值爲1,並且遞增一直持續到i + 1 = 128 - 它將符號位翻轉爲有符號整數,然後運行循環直到++我導致i爲0.
順便說一下,for循環是可怕的。你知道它應該是for(intialisation; end condition; increment)
,對吧?
無論如何。我初始化爲0;第一個圍繞for循環測試具有預增量的結束條件(++ i)。所以我增加到1,循環運行打印1.
現在重複。每個循環爲i打印一個更高的值,因爲結束條件測試是預先遞增的。
最終我達到127;它然後增加到128,但你打印它爲「%d」期待一個有符號的整數,所以使用二進制補碼將其解釋爲-128。
增量然後一直延續到255(打印爲-1)。下一個預增量會導致溢出,所以我再次變爲0,此時「結束條件測試」計算結果爲false,循環停止。
這個程序有很奇怪的用於循環。 你通過檢查它們初始化你的循環變量「i < = 5 & & i> = - 1」 - 沒有完成任務。 循環期間評估條件「++ i」,這是真實的,直到i = -1;並在增量步驟中檢查數字是否大於零。
你做實際上:
for(i = 1; i != 0; i++)
{
printf("%d\t",i);
}
溢出以上127你從1到127的數字和從-128到-1。
雖然對於任何人都有好的閱讀體驗。 – 2013-02-28 14:32:40