簡體   English   中英

為什么這個 size_t i = size 變量在 for 循環中使用時給出“垃圾”值?

[英]Why does this size_t i = size variable giving "garbage" value when used in for loop?

我已經將 size 定義為 6 的傳遞值,跟蹤“size”的值也產生了 6,但是當我使用 size,甚至是簡單的 6 來初始化 i 但在 for 循環中, i 的值變成了垃圾。 在這種情況下,我只是初始化 6 的值以便於解釋。 據我所知,size_t 類似於 unsigned int 或 unsigned long int,具體取決於編譯器

for (size_t i = 6 ; i >= 0; --i){
        printf("%lu\n",i);
    }

gcc -Wall -Wextra打來電話說你好:

警告:'>= 0' 中無符號表達式的比較始終為真 [-Wtype-limits]

幫自己一個忙,停止搜索編譯器已經發現的錯誤,遵循以下建議:為初學者學習 C 推薦哪些編譯器選項?


現在在這種情況下發生的是無符號整數有明確定義的環繞。 當超過 0 時, size_t將因此獲得一個非常大的整數值。

然后你對printf撒謊,說你正在傳遞一個有signed long ,而實際上你傳遞的是一個 unsigned size_t 嚴格來說,這是未定義的行為,任何事情都可能發生。 要使用的正確轉換說明符是%zu

實際上,在具有 8 位long的系統上,您可能會得到諸如 18446744073709551615 之類的輸出,但這不能保證,因為它是一個錯誤。 在任何一種情況下,它都是一個永恆的循環,它將掛起程序。

i >= 0 始終為真,因為 i 是 size_t 並且不能低於 0

所以循環不會終止,這是你的編譯器接受與否取決於你的編譯選項

如果將 size_t 遞減為 0,則此 size_t 將獲得 size_t 的最大可能值。

如果您希望打印 0,您可以使用 i > 0 代替或使用for(int i = 6;i >= 0;--i)

PS: %zu 用於 size_t 和 %d 用於 int (或 %i , %d 用於十進制整數輸入)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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