341

ゼロは常にゼロなので問題ありません。しかし、友人との最近の議論で、8 進リテラルは今日ほとんど使われていないと彼は言いました。†</sup> その後、コード内のほとんどすべての整数リテラルが実際には 8 進数であることに気付きました。0

0C++ 文法によると、8 進リテラルですか? 基準は何と言っていますか?

†</sup> 私が認識している唯一の実際の用途は、UNIX ファイルのパーミッションです。

4

3 に答える 3

302

はい、C++ 08 進リテラルです。

C++ 標準に従って:

2.14.2 整数リテラル [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit
于 2011-08-01T07:48:30.910 に答える
45

で始まる整数値0はすべて 8 進数です。つまり、01 は 8 進数の 1、010 は 8 進数の 10、つまり 10 進数の 8、0 は 8 進数の 0 (10 進数、その他は 0) です。

はい、「0」は8進数です。

これは、@ Als の回答の文法スニペットの平易な英訳です :-)


の接頭辞が付いた整数に0xは、接頭辞が付いていません00xは明示的に異なる接頭辞です。この区別がつかない人もいるようです。

同じ基準に従って、続けると:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit
于 2011-08-01T07:54:34.437 に答える
-2

明らかに、ゼロで始まるすべての整数リテラルは実際には8進数です。これは、0も含まれることを意味します。ゼロはゼロなので、これはほとんど違いがありません。しかし、この事実を知らないとあなたを傷つける可能性があります。

これは、2進数を10進数と16進数の出力に変換するプログラムを作成しようとしたときにわかりました。ゼロから始まる数値を与えるたびに、間違った出力が得られていました(たとえば、012 = 10、12ではありません)。

同じ間違いをしないように、この情報を知っておくとよいでしょう。

于 2011-08-01T13:06:32.507 に答える