[問題] 十三誡之七的疑問

看板C_and_CPP作者 (沒有存在感的人)時間8年前 (2016/04/15 22:28), 編輯推噓4(4025)
留言29則, 7人參與, 最新討論串1/2 (看更多)
問題(Question): 13誡之7有這一段: 錯誤例子: unsigned int a = 0; int b[10]; for(int i = 9 ; i >= a ; i--) { b[i] = 0; } 說明:由於 int 與 unsigned 共同運算的時候,會提升 int 為 unsigned, 因此迴圈條件永遠滿足,與預期行為不符 可是我昨天讀K&R第2版的時候,P43頁寫到: Comparisons between signed and unsigned values are machine-dependent. 不過他舉的例子是long vs. unsigned int 和 long vs. unsigned long 我想問的是 int vs. unsigned int 的情況下是不是一定會把int升級為unsigned int? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.60.207 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460730509.A.9C1.html

04/15 22:32, , 1F
04/15 22:32, 1F

04/15 22:34, , 2F
請問這是在spec裏面規定的嗎?
04/15 22:34, 2F

04/15 22:35, , 3F
查到的都是說,signed會變成unsigned
04/15 22:35, 3F

04/15 22:36, , 4F
K&R裡說,long vs unsigned int的情況unsigned int有可能
04/15 22:36, 4F

04/15 22:36, , 5F
變成signed long
04/15 22:36, 5F

04/15 22:37, , 6F
unsigned int rank >= int 所以會往 unsigned 轉
04/15 22:37, 6F

04/15 22:37, , 7F
看來不找一份 spec 出來看不行了...
04/15 22:37, 7F

04/15 22:37, , 8F
因為 long 和 unsigned int 不一定誰"大" so 不一定
04/15 22:37, 8F

04/15 22:38, , 9F
spec有吧 我記得是promotion rank字眼的 還有 K&R很舊了
04/15 22:38, 9F

04/15 22:39, , 10F
雖說 ISO 要錢,但前幾天翻到一份 IETF draft 免費的
04/15 22:39, 10F

04/15 22:39, , 11F
應該只是格式不同,一樣都是講 C89/C90
04/15 22:39, 11F

04/15 22:41, , 12F
C11 spec有701頁,剛丟關鍵字comparison都找沒...
04/15 22:41, 12F

04/15 22:42, , 13F
try google "c integer compare promotion" XD
04/15 22:42, 13F

04/15 22:43, , 14F
C++ standard n4567, p84, 4.7.2, 4.7.3
04/15 22:43, 14F

04/15 22:43, , 15F
這兩個就是你要的
04/15 22:43, 15F

04/15 22:44, , 16F
找到了,C11 spec P69
04/15 22:44, 16F

04/15 22:44, , 17F
感謝
04/15 22:44, 17F

04/15 22:45, , 18F
04/15 22:45, 18F

04/15 22:47, , 19F
感謝,不過意外看到原來 unsigned char跟signed char
04/15 22:47, 19F

04/15 22:47, , 20F
等級是一樣的,signed char不會升級成unsigned char
04/15 22:47, 20F

04/15 22:48, , 21F
而是implementation-defined
04/15 22:48, 21F

04/15 22:50, , 22F
char 有點特別, 因為 char/unsigned char/signed char
04/15 22:50, 22F

04/15 22:50, , 23F
好的寫法就是隨時都要注意signed跟unsigned...
04/15 22:50, 23F

04/15 22:50, , 24F
三者是三個型態, 第一個會跟後兩個其一有同樣的有號性
04/15 22:50, 24F

04/15 22:51, , 25F
但並沒有規定是哪一個 (這記得是 implementation defined)
04/15 22:51, 25F

04/16 11:36, , 26F
感謝分享, 可以把這參考資料加入 13 戒嗎?
04/16 11:36, 26F

04/16 11:37, , 27F
沒有官方正式背書, 不是很能確認 13 戒的真實性
04/16 11:37, 27F

04/16 12:10, , 28F
13誡有哪條讓你懷疑的?
04/16 12:10, 28F

04/16 15:29, , 29F
應該避免寫執行結果是 machine-dependent 的程式碼。
04/16 15:29, 29F
文章代碼(AID): #1N4FgDd1 (C_and_CPP)
文章代碼(AID): #1N4FgDd1 (C_and_CPP)