ゼロは常にゼロなので問題ありません。しかし、友人との最近の議論で、8 進リテラルは今日ほとんど使われていないと彼は言いました。†</sup> その後、コード内のほとんどすべての整数リテラルが実際には 8 進数であることに気付きました。0
0
C++ 文法によると、8 進リテラルですか? 基準は何と言っていますか?
†</sup> 私が認識している唯一の実際の用途は、UNIX ファイルのパーミッションです。
はい、C++ 0
の8 進リテラルです。
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
で始まる整数値0
はすべて 8 進数です。つまり、01 は 8 進数の 1、010 は 8 進数の 10、つまり 10 進数の 8、0 は 8 進数の 0 (10 進数、その他は 0) です。
はい、「0」は8進数です。
これは、@ Als の回答の文法スニペットの平易な英訳です :-)
の接頭辞が付いた整数に0x
は、接頭辞が付いていません0
。0x
は明示的に異なる接頭辞です。この区別がつかない人もいるようです。
同じ基準に従って、続けると:
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
明らかに、ゼロで始まるすべての整数リテラルは実際には8進数です。これは、0も含まれることを意味します。ゼロはゼロなので、これはほとんど違いがありません。しかし、この事実を知らないとあなたを傷つける可能性があります。
これは、2進数を10進数と16進数の出力に変換するプログラムを作成しようとしたときにわかりました。ゼロから始まる数値を与えるたびに、間違った出力が得られていました(たとえば、012 = 10、12ではありません)。
同じ間違いをしないように、この情報を知っておくとよいでしょう。