0は10進数リテラルまたは8進数リテラルですか?


329

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

ある0進リテラルは、C ++の文法に従いましたか?標準は何と言っていますか?

私が知っている唯一の実際の用途は、UNIXファイルのアクセス許可です。


6
これはJavaでも同じですか?
フィリップ

80
まったく関係のない質問をして、大量の賛成票を獲得した場合の+1 :-)
Kerrek SB

64
SOのインスタント担当者への道は深い質問ではなく、奇妙な質問だと思います。その答えは、水クーラーでオタクを信用するでしょう:)
Josh

4
すばらしい質問:) Java言語仕様で調べましたが、Javaでは 10進数です。仕様には次の引用も含まれています。8 進数は常に2桁以上で構成されることに注意してください。0は常に10進数と見なされます-実際にはそれほど重要ではありません。0、00、0x0の数字はすべてまったく同じ整数値を表すためです。
Tobias Ritzau

14
「はい、0は10進数のリテラルまたは8進数のリテラルです」という回答を投稿したくなる気がします。
キース・トンプソン

回答:


296

はい、0ありオクタルリテラルの C ++インチ

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

39
もう1つの重要な点は、10進数リテラルゼロ以外の数字の後にゼロ以上の数字が続くため、あいまいさがないことです。
CBベイリー

3
@MSalters:ご使用のバージョンでは、さらに設定を指定する必要があります。両方 octal-literaldecimal-literal、バイトパターンの可能な解釈である場合、を選択しoctal-literalます。公式規格の文言にはこの問題はありません。
Martin Sojka、2011

23
@MSalters:10進数リテラルを任意の桁数にすることはできません。単一のゼロまたはゼロ以外の数字の後に任意の桁を続ける必要があります。そうしないと、すべての 8進数リテラルが10進数リテラルとして解釈されます。コンパイルエラーが表示されますERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
CBベイリー2011

3
@MSaltersこの例では、0123は8進数リテラルと10進数リテラルの両方に一致しますが、どちらの方法でも意味は異なります。
ふわふわ

5
@CharlesBailey - FTFYと1依然としてオクタル、すべてされ; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg

44

接頭辞付きの整数値はすべて08進値です。つまり、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

5
「「0」で始まるすべての整数値は8進値です。」違います。例:0xAは「0」で始まり、整数値です。
Nikolai Ruhe

4
0xトークンではありません。で始まる整数リテラル0xは単一のトークンです。
キース・トンプソン

4
その定義についてどのような情報源を引用していますか?「トークン」という単語は、C(N1570 6.4)およびC ++(C ++ 11 2.7 [lex.token])標準によって構文的に定義されています。0x資格はありません。(少なくともCでは、16進定数の一部ではないが、それがトークンではない場合、これは前処理番号(N1570 6.4.8)です。)
Keith Thompson

11
CおよびC ++標準で定義されている整数定数/リテラル​​の構文について説明します。標準の「トークン」の定義は、この文脈で使用するのに最も適切なものではないのはなぜですか。あなたの侮辱的な侮辱は不適切です。そして、私があなたの答えの技術的誤りであると私が思う何かを指摘するためのいじめっ子だと思うなら、私はあなたにその単語の意味を再考するべきだと提案します。(あなたはあなたの定義の出所についての私の質問に答えたことはありません。)
キース・トンプソン

4
誰かが興味を持っている場合、「トークンはグループとして重要な1つ以上の文字の文字列です。」という文は、このWikipediaの記事にあるようです。
キーストンプソン

-2

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

2進数を10進数および16進数の出力に変換するプログラムを書こうとしたときに、これに気付きました。ゼロから始まる数値を指定するたびに、誤った出力が得られました(たとえば、012 = 10、12ではありません)。

同じ間違いを犯さないように、この情報を知っておくことは良いことです。


7
ゼロから始まり、ゼロの後に「x」がない整数リテラル。
luiscubal 2011

5
証明のない主張「はい」も答えではありません。
オービットの軽量レース、2011

1
このロジックでは、09は8進数です。
0xc0de 2013

3
@ 0xc0de:いいえ、これ09は8進数ではありません。これは、まったく数値ではないためです。あらゆる種類の整数リテラルの構文とは一致しません。
キーストンプソン

7
@ 0xc0de はそれが8進数ではないこと知っている09と確信しいます。何と言われたことは、「たこのロジックでは09進数です。」意味は、09は8進数ではないため、ロジックが間違っているはずです。
TRiG 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.