¿Qué tienen de especial los números que comienzan con cero?

Esta es una pregunta un poco estúpida, pero es interesante para mí)

Esto es lo que obtengo 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... 

Si el número comienza con cero y contiene 8, es un error de comstackción. ¿Esto es normal? ¿Y qué hace exactamente el comstackdor con cero inicial si 00016 == 14?

Gracias a todos ))

Sí, esto es esperado.

[C++11: 2.14.2/1]: Un literal entero es una secuencia de dígitos que no tiene una parte de período o exponente. Un literal entero puede tener un prefijo que especifique su base y un sufijo que especifique su tipo. El primer dígito léxico de la secuencia de dígitos es el más significativo. Un literal entero decimal (base diez) comienza con un dígito distinto de 0 y consiste en una secuencia de dígitos decimales. Un entero literal octal (base ocho) comienza con el dígito 0 y consiste en una secuencia de dígitos octales. 22 Un literal entero hexadecimal (base dieciseis) comienza con 0x o 0X y consiste en una secuencia de dígitos hexadecimales, que incluyen los dígitos decimales y las letras aa f y A a F, con valores decimales del diez al quince. [Ejemplo: el número doce se puede escribir 12, 014 o 0XC. -Final ejemplo]

22 Los dígitos 8 y 9 no son dígitos octales.

Un entero de literal que comienza con 0 es un número octal , al igual que un número que comienza con 0x es un número hexadecimal.

Los números octales solo pueden contener los dígitos del 0 al 7 , y es por eso que obtienes un error de comstackción.

Los literales enteros que comienzan con 0 son literales octales . Por lo tanto, solo deben contener los dígitos 0-7.

(Divertidamente, esto incluye el literal 0 sí).

Comenzar un número con 0 lo convierte en Octal, por lo que los dígitos 8 y 9 son ilegales, y los otros ejemplos muestran la conversión a decimal.