Cosa c’è di speciale nei numeri che iniziano con zero?

Questa è una domanda stupida, ma è interessante per me)

Questo è ciò che ottengo con Visual Studio 2013

int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow ) int i = 08; // compile error, compiler expects octal number... 

Se il numero inizia con zero e contiene 8, si tratta di un errore di compilazione. È normale? E cosa fa esattamente il compilatore con gli zeri iniziali se 00016 == 14?

Grazie a tutti ))

Sì, è previsto.

[C++11: 2.14.2/1]: un intero letterale è una sequenza di cifre che non ha parti periodiche o esponenti. Un valore letterale intero può avere un prefisso che ne specifica la base e un suffisso che ne specifica il tipo. La prima cifra lessicale della sequenza di cifre è la più significativa. Un intero decimale letterale (base dieci) inizia con una cifra diversa da 0 e consiste in una sequenza di cifre decimali. Un numero intero ottale (base otto) inizia con la cifra 0 e consiste in una sequenza di cifre ottali. 22 Un letterale intero esadecimale (base sedici) inizia con 0x o 0X e consiste in una sequenza di cifre esadecimali, che includono le cifre decimali e le lettere da a f e da A a F con valori decimali da dieci a quindici. [Esempio: il numero dodici può essere scritto 12, 014 o 0XC. -End esempio]

22 Le cifre 8 e 9 non sono cifre ottali.

Un numero intero letterale che inizia con 0 è un numero ottale , molto simile a un numero che inizia con 0x è un numero esadecimale.

I numeri ottali possono contenere solo le cifre da 0 a 7 , ed è per questo che si ottiene un errore di compilazione.

I valori letterali interi che iniziano con 0 sono valori letterali ottali . Pertanto devono contenere solo le cifre 0-7.

(In modo divertente, questo include lo stesso valore letterale.)

L’avvio di un numero con 0 lo rende ottale, quindi le cifre 8 e 9 sono illegali e gli altri esempi mostrano la conversione in decimale.