2014-10-25 3 views
1

Это своего рода глупый вопрос, но интересно для меня)Что особенного в числах, начинающихся с нуля?

Это то, что я получаю с визуальной студии 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... 

Если номер начинается с нуля и содержит 8, это ошибка компиляции. Это нормально? И что именно делает компилятор с начальными нулями, если 00016 == 14?

Спасибо всем))

+0

Октальные целые литералы. (Как должно быть охвачено любым базовым учебным пособием по C или C++.) –

+1

Хорошо сделано для правильной и тщательной идентификации шаблона. :) Не так хорошо сделано для того, чтобы не выполнять никаких последующих исследований! :( –

+5

сообщение компилятора, содержащее слово «восьмеричный», отдали его ... – SirDarius

ответ

8

Да, это ожидается.

[C++11: 2.14.2/1]:целочисленный литерал представляет собой последовательность цифр, что не имеет срока или показатель степени часть. Целочисленный литерал может иметь префикс, который указывает его базу и суффикс, который указывает его тип. Лексически первая цифра последовательности цифр является наиболее значимой. A decimal целочисленный литерал (базовая десятка) начинается с цифры, отличной от 0, и состоит из последовательности десятичных цифр. восьмеричный целочисленный литерал (базовая восьмерка) начинается с цифры 0 и состоит из последовательности восьмеричных цифр. A hexadecimal целочисленный литерал (базовый шестнадцати) начинается с 0x или 0X и состоит из последовательности шестнадцатеричных цифр, которые включают десятичные цифры и буквы от a до f и от A до F с десятичными значениями от десяти до пятнадцати. [Пример: Число двенадцать может быть записано 12, 014 или 0XC. -end пример]

Цифра 8 и 9 не являются восьмеричными цифрами.

2

Целые литералы, которые начинаются с 0 являются восьмеричное литералы. Поэтому они должны содержать только цифры 0 – 7.

(Занятно, это включает в себя сам буквальный 0.)

+0

Что в этом такого забавного?:/ –

+1

@LightnessRacesinOrbit: Я неоднократно использовал этот факт в качестве ледокола в своих ежемесячных подпрограммах. Полагаю, вам нужно немного подстроить его. –

+0

@LightnessRacesinOrbit Я не думаю, что люди ожидали бы, что 0 будет восьмым буквальным. – 0x499602D2

2

Начиная число с 0 делает его восьмеричной, так цифры 8 и 9, являются незаконными, и ваши другие примеры показывают преобразование в десятичную.

5

Целочисленный литерал, который начинается с 0, является octal number, очень похожим на число, начинающееся с 0x - это шестнадцатеричное число.

Октальные цифры могут содержать только цифры 0 до 7, и именно поэтому вы получаете ошибку компиляции.

Смежные вопросы