簡體   English   中英

我不了解該程序的工作原理

[英]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 i128溢出到-127為止。然后繼續遞增,直到達到-1為止,此時++i值為0 ,循環終止

編輯

因此,根據您的代碼,在循環的第一次迭代的最開始執行i<=5 && i>=-1 (這絕對不會完成任何操作),然后對++i進行布爾狀態評估(其0到開始,並使用預增量,求值為1 ,因此不為0因此布爾值通過),然后執行i>0update部分,這同樣不執行任何操作。

編輯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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM