[英]I did not understand how this program works
在以下程序中
#include<stdio.h>
int main()
{
char i=0;
for(i<=5 && i>=-1;++i;i>0)
printf("%d\t",i);
return 0;
}
“ i”從1到127,然后從-128到-1打印。
為什么會這樣呢?
那一定是我一生中見過的最畸形的循環。 For循環的格式如下
for ( initalization; condition; update )
在for
循環的開始,發生initialization
。 這通常類似於i = 0
。 在每個循環的頂部,對condition
(通常為i < 5
)進行評估,以查看循環是否應該繼續,並且如果循環繼續,則執行update
(同樣,通常類似於++i
),並且循環再次執行。
這里發生的是,循環使用++i
作為條件,因此它只會在++i
值為0
時終止,因此您從1
開始並遞增,直到char i
從128
溢出到-127
為止。然后繼續遞增,直到達到-1
為止,此時++i
值為0
,循環終止
編輯
因此,根據您的代碼,在循環的第一次迭代的最開始執行i<=5 && i>=-1
(這絕對不會完成任何操作),然后對++i
進行布爾狀態評估(其0
到開始,並使用預增量,求值為1
,因此不為0
因此布爾值通過),然后執行i>0
的update
部分,這同樣不執行任何操作。
編輯2
如果您的問題確實是關於為什么會發生1,2....128,-127,-126....-1
那么Joachim對該行為提供了很好的解釋
好消息:在您的實現中,已簽名char
!
同樣,發生的是i
的值從127溢出到-128,因為127是適合帶符號char
的最大正值。
編輯:實際上,我不確定您的實現中char
的符號,但是循環完全中斷了:
應該是
for (i = 0; i <= 5; i++)
但這只是一個猜測。 很難解釋。
char
是編譯器中帶符號的8位整數。 它可以表示從-128到+127的值。 循環結束條件是++i
,並且在C中所有非零值都被認為是true,因此它將循環直到++i
為零,這將在i
為-1
時發生。
if從127到-128的原因是有符號整數在計算機中的工作方式。 127的二進制位是01111111
,-128的位模式是1000000
。 將1加上01111111
將得到10000000
。
總而言之,您的for
循環沒有任何實際意義。 這在語法上是正確的,但沒有任何意義。 有關for循環工作原理的說明,請參見Dan F的答案。
您可能想閱讀有關Two的補碼表示形式的信息
程序在打印時將“ i”解釋為一個8位帶符號整數,表示一位為符號,七位為數據。 有效值的范圍為-128到127。
“ for”循環在printf之前使i 遞增 ,因此將其首過值設置為1,並且遞增過程一直持續到i + 1 = 128為止(這會翻轉帶符號整數中的符號位,然后運行循環直到++)我使我為0。
順便說一句,for循環是可怕的。 您知道應該for(intialisation; end condition; increment)
,對嗎?
無論如何。 我被初始化為0; for循環的第一步是測試具有預增量的結束條件(++ i)。 所以我增加到1,循環運行打印1。
現在重復。 每個循環都為i打印一個更高的值,因為最終條件測試正在使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的數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.