351 Stimmen

Ist 0 ein Dezimal- oder ein Oktal-Literal?

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

Ist 0 ein oktales Literal gemäß der C++-Grammatik? Was besagt der Standard?

<sup>† </sup>Die einzige wirkliche Verwendung, die mir bekannt ist, ist für Unix-Dateiberechtigungen.

315voto

Alok Save Punkte 196241

Ja, 0 ist ein Oktal wörtlich in C++.

Gemäß dem 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

47voto

littleadv Punkte 19953

Jeder ganzzahlige Wert mit dem Präfix 0 ist ein oktaler Wert. D.h.: 01 ist oktal 1, 010 ist oktal 10, was dezimal 8 ist, und 0 ist oktal 0 (was dezimal ist, und jede andere, 0).

Also ja, '0' ist ein Oktal.

Das ist die einfache englische Übersetzung des Grammatikschnipsels in @Als' Antwort :-)


Eine Ganzzahl mit vorangestelltem 0x es n mit vorangestelltem 0 . 0x ist ein ausdrücklich anderes Präfix. Offenbar gibt es Menschen, 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

0voto

MCG Punkte 71

Offenbar sind alle ganzzahligen Literale, die mit Null beginnen, tatsächlich oktal. Das bedeutet, dass sie auch 0 enthalten. Dies macht keinen großen Unterschied, da Null gleich Null ist. Aber diese Tatsache nicht zu kennen, kann Ihnen schaden.

Das wurde mir klar, als ich versuchte, ein Programm zu schreiben, das Binärzahlen in Dezimal- und Hexidezimalwerte umwandelt. Jedes Mal, wenn ich eine mit Null beginnende Zahl eingab, erhielt ich die falsche Ausgabe (zum Beispiel 012 = 10, nicht 12).

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X