[英]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.