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 0
ein Oktalliteral der C ++ - Grammatik? Was sagt der Standard?
† Die einzige wirkliche Verwendung, die mir bekannt ist, sind Unix-Dateiberechtigungen.
Antworten:
Ja,
0
ist ein Oktal-Literal in C ++.Gemäß C ++ Standard:
2.14.2 Ganzzahlige Literale [lex.icon]
quelle
octal-literal
unddecimal-literal
mögliche Interpretationen des Bytemusters sind, wählen Sieoctal-literal
. Der Wortlaut des offiziellen Standards hat dieses Problem nicht.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
immer noch oktal und alle; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Jeder vorangestellte ganzzahlige Wert
0
ist 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
0x
wird kein Präfix vorangestellt0
.0x
ist ein explizit anderes Präfix. Anscheinend gibt es Leute, die diese Unterscheidung nicht treffen können.Nach demselben Standard, wenn wir fortfahren:
quelle
0x
ist kein Token. Ein ganzzahliges Literal, das mit beginnt,0x
ist ein einzelnes Token.0x
qualifiziert 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.)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.
quelle
09
ist keine Oktalzahl, weil es überhaupt keine Zahl ist. Es stimmt nicht mit der Syntax für ein ganzzahliges Literal überein.09
keine Oktalzahl ist. Was wurde gesagt war : „ Nach dieser Logik ,09
eine Oktalzahl ist.“ Die Implikation ist, dass die Logik falsch sein muss , da09
es sich nicht um eine Oktalzahl handelt.