[問題] c99文件的疑問

看板C_and_CPP作者 (learning)時間15年前 (2009/09/02 02:25), 編輯推噓10(10011)
留言21則, 7人參與, 最新討論串1/1
最近看了c99文件的整數常數部分, 有點不太理解, 不知是否有高人可以解釋? 6.4.4.1 Integer constants Syntax (語法) 其中一小段 decimal-constant: (1) nonzero-digit decimal-constant digit octal-constant: (2) 0 octal-constant octal-digit hexadecimal-constant: (3) hexadecimal-prefix hexadecimal-digit hexadecimal-constant hexadecimal-digit (1)(2)(3)分別列出10進位,8進位,16進位的整數常數格式, 但是下面各又列出兩行, 不知是表示什麼意思? ※ 編輯: rdfs 來自: 123.193.68.81 (09/02 02:26)

09/02 02:39, , 1F
分別表示 10/8/16 進位常數的開頭跟實際常數值的格式
09/02 02:39, 1F

09/02 02:41, , 2F
10進位以非零數字開始,後面接著10進位常數數字
09/02 02:41, 2F

09/02 02:41, , 3F
8 進位以零開始,後面接著 8 進位常數數字
09/02 02:41, 3F

09/02 02:42, , 4F
16進位以16進位字首(0x)開始,後面接著16進位常數數字
09/02 02:42, 4F

09/02 03:05, , 5F
可是6.1節的notation部分有說, 不同行是代表不同的表示方式
09/02 03:05, 5F

09/02 03:05, , 6F
看的霧煞煞 ...
09/02 03:05, 6F

09/02 04:45, , 7F
10進位數 = 一個非零數字 or 10進位數後面再接一個數字
09/02 04:45, 7F

09/02 04:46, , 8F
後面同理
09/02 04:46, 8F
因為c99文件中,好像冒號之後, 下面的每一行是各代表一種表示方式, 也就是說第一行和第二行是無關的, 各自代表可以獨立使用的合法格式 舉(2)為例, 看了半天, 覺得文件中的意思可能是, 八進位常數第一類可以是 0 , 而第二類可以是 octal-constant + octal digit 根據第二類的定義, 因為0是也是一種octal-constant(屬第一類), 所以 0 + octal digit 也是一種合法的格式, 假設是06 而06 + octal digit 也是一種合法的格式 至於文件中10進位和16進位的描述, 應該也是這樣的意思? 但是這樣定義, 0似乎就不是屬於10進位的常數了? 好像要改成: decimal-constant: digit nonzero-digit decimal-constant 這樣才合理? 這麼仔細看文件, 是覺得它可能寫的蠻嚴謹的. ※ 編輯: rdfs 來自: 123.193.68.81 (09/02 06:58)

09/02 07:03, , 9F
對, 0是八進位常數
09/02 07:03, 9F

09/02 07:06, , 10F
你的改法會讓十進位常數最多只到兩位數..
09/02 07:06, 10F

09/02 07:11, , 11F
感覺就是寫給做compiler的人看的規格敘述
09/02 07:11, 11F

09/02 07:17, , 12F
我看就是某種簡化的(E)BNF 對那個有概念就不會感到奇怪
09/02 07:17, 12F
※ 編輯: rdfs 來自: 123.193.68.81 (09/02 07:47)

09/02 07:47, , 13F
改成這樣..呵
09/02 07:47, 13F

09/02 07:54, , 14F
這樣寫的話,只能產生出210之類十進位,不能產生如403
09/02 07:54, 14F

09/02 07:57, , 15F
其實只是要一個模型可以把一串常數判斷出屬於哪種進位
09/02 07:57, 15F

09/02 07:57, , 16F
判斷完後,compiler才方便轉成機械碼的二進位,所以不必
09/02 07:57, 16F

09/02 07:58, , 17F
太在意原本的寫法中,0會被判斷成八進位,因為值不會變
09/02 07:58, 17F

09/02 09:28, , 18F
Oh My God, 原來八進位const是直接加0(零)開頭, 小弟本
09/02 09:28, 18F

09/02 09:29, , 19F
來還以為是加什麼o或o什麼的prefix....Orz
09/02 09:29, 19F

09/02 10:41, , 20F
有打錯過就會知道了 XD
09/02 10:41, 20F

09/02 10:46, , 21F
小弟我都養成用 0x#### 的好習慣....(光速逃XD)
09/02 10:46, 21F
文章代碼(AID): #1AdMSV-y (C_and_CPP)