Ist 0 ein Dezimalliteral oder ein Oktalliteral?


329

Null ist immer Null, also spielt es keine Rolle. In einer kürzlichen Diskussion mit einem Freund sagte er jedoch, dass oktale Literale heute fast unbenutzt sind. Dann dämmerte es mir , dass eigentlich fast alle Ganzzahlliterale in meinem Code sind Oktal, nämlich 0.

Entspricht 0ein Oktalliteral der C ++ - Grammatik? Was sagt der Standard?

Die einzige wirkliche Verwendung, die mir bekannt ist, sind Unix-Dateiberechtigungen.


6
Ist das auch für Java so?
Philippe

80
+1 für das Stellen einer völlig irrelevanten Frage und das Erhalten von Tonnen von Upvotes :-)
Kerrek SB

63
Ich denke, der Weg zu einer sofortigen Wiederholung auf SO ist keine tiefgreifende Frage, sondern eine eigentümliche Frage, deren Antwort Ihnen einen Geek-Ruf am Wasserkühler einbringen würde :)
Josh

4
Tolle Frage :) Ich habe es in der Java-Sprachspezifikation nachgeschlagen und in Java ist es dezimal. Die Spezifikation enthält sogar das folgende Zitat: Beachten Sie, dass Oktalzahlen immer aus zwei oder mehr Ziffern bestehen. 0 wird immer als Dezimalzahl betrachtet - nicht, dass es in der Praxis sehr wichtig ist, denn die Ziffern 0, 00 und 0x0 repräsentieren alle genau den gleichen ganzzahligen Wert.
Tobias Ritzau

14
Ich bin fast versucht, eine Antwort zu schreiben, die besagt: "Ja, 0 ist ein Dezimalliteral oder ein Oktalliteral."
Keith Thompson

Antworten:


296

Ja, 0ist ein Oktal-Literal in C ++.

Gemäß C ++ Standard:

2.14.2 Ganzzahlige Literale [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
Der andere wichtige Punkt ist, dass ein Dezimalliteral eine Ziffer ungleich Null ist, gefolgt von einer Null oder mehr Ziffer, sodass keine Mehrdeutigkeit besteht.
CB Bailey

3
@MSalters: Bei Ihrer Version müssen Sie zusätzlich die Präferenz angeben: Wenn beides octal-literal und decimal-literalmögliche Interpretationen des Bytemusters sind, wählen Sie octal-literal. Der Wortlaut des offiziellen Standards hat dieses Problem nicht.
Martin Sojka

23
@MSalters: Sie konnte immer noch nicht haben Dezimal-wörtlichen wie eine beliebige Anzahl von Ziffern, wäre es eine einzelne Null oder eine Ziffer ungleich Null , gefolgt von irgendwelchen Ziffern sein müssen sonst jeder Oktal wörtlichen als Dezimalzahl wörtlichen interpretiert werden könnte. Ich kann den Kompilierungsfehler jetzt sehen : ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey

3
@MSalters In Ihrem Beispiel würde 0123 sowohl mit Oktal-Literal als auch mit Dezimal-Literal übereinstimmen, aber in beiden Fällen unterschiedliche Bedeutungen haben.
flauschig

5
@ CharlesBailey - FTFY, mit 1immer noch oktal und alle; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Twalberg

44

Jeder vorangestellte ganzzahlige Wert 0ist ein Oktalwert. Dh: 01 ist Oktal 1, 010 ist Oktal 10, was Dezimalzahl 8 ist, und 0 ist Oktal 0 (was Dezimalzahl ist, und jede andere, 0).

Also ja, '0' ist ein Oktal.

Das ist eine einfache englische Übersetzung des Grammatik-Snippets in @ Als's Antwort :-)


Einer Ganzzahl mit dem Präfix 0xwird kein Präfix vorangestellt 0. 0xist ein explizit anderes Präfix. Anscheinend gibt es Leute, die diese Unterscheidung nicht treffen können.

Nach demselben Standard, wenn wir fortfahren:

 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
"Jeder ganzzahlige Wert, der mit '0' beginnt, ist ein Oktalwert." Nicht wahr. Beispiel: 0xA beginnt mit '0' und ist ein ganzzahliger Wert.
Nikolai Ruhe

4
0xist kein Token. Ein ganzzahliges Literal, das mit beginnt, 0xist ein einzelnes Token.
Keith Thompson

4
Welche Quelle zitieren Sie für diese Definition? Das Wort "Token" wird syntaktisch durch die Standards C (N1570 6.4) und C ++ (C ++ 11 2.7 [lex.token]) definiert. 0xqualifiziert sich nicht. (Zumindest in C ist es eine Vorverarbeitungszahl (N1570 6.4.8), wenn sie nicht Teil einer hexadezimalen Konstante ist, aber das ist kein Token.)
Keith Thompson

11
Wir diskutieren die Syntax von Ganzzahlkonstanten / Literalen, wie sie durch die C- und C ++ - Standards definiert sind . Wie ist die Definition von "Token" durch die Standards in diesem Zusammenhang nicht am besten geeignet? Ihre beleidigende Herablassung ist unangemessen. Und wenn Sie denken, ich bin ein Tyrann, weil ich auf etwas hingewiesen habe, das meiner Meinung nach ein technischer Fehler in Ihrer Antwort ist, sollten Sie die Bedeutung dieses Wortes überdenken. (Sie haben meine Frage nach der Quelle Ihrer Definition nie beantwortet.)
Keith Thompson

4
Wenn jemand neugierig ist, scheint die Aussage " Ein Token ist eine Zeichenfolge aus einem oder mehreren Zeichen, die als Gruppe von Bedeutung ist " aus diesem Wikipedia-Artikel zu stammen .
Keith Thompson

-2

Anscheinend sind alle ganzzahligen Literale, die mit Null beginnen, tatsächlich oktal. Dies bedeutet, dass es auch 0 enthält. Dies macht wenig Unterschied, da Null Null ist. Aber wenn Sie diese Tatsache nicht kennen, können Sie verletzt werden.

Dies wurde mir klar, als ich versuchte, ein Programm zum Konvertieren von Binärzahlen in dezimale und hexadezimale Ausgaben zu schreiben. Jedes Mal, wenn ich eine Zahl gab, die mit Null begann, erhielt ich die falsche Ausgabe (zum Beispiel 012 = 10, nicht 12).

Es ist gut, diese Informationen zu kennen, damit Sie nicht denselben Fehler machen.


7
Ganzzahlige Literale, die mit Null beginnen, jedoch ohne das 'x' nach der Null.
luiscubal

5
Eine Behauptung "Ja" ohne Beweis ist ebenfalls keine Antwort.
Leichtigkeitsrennen im Orbit

1
Nach dieser Logik ist 09 eine Oktalzahl.
0xc0de

3
@ 0xc0de: Nein, 09ist keine Oktalzahl, weil es überhaupt keine Zahl ist. Es stimmt nicht mit der Syntax für ein ganzzahliges Literal überein.
Keith Thompson

7
Ich bin ziemlich sicher, dass @ 0xc0de weiß, dass dies 09keine Oktalzahl ist. Was wurde gesagt war : „ Nach dieser Logik , 09eine Oktalzahl ist.“ Die Implikation ist, dass die Logik falsch sein muss , da 09es sich nicht um eine Oktalzahl handelt.
TRiG
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.