Целочисленный литерал
В информатике целочисленный литерал — это своего рода литерал для целого числа которого , значение непосредственно представлено в исходном коде . Например, в операторе присваивания x = 1
, строка 1
является целочисленным литералом, указывающим значение 1, а в операторе x = 0x10
строка 0x10
является целочисленным литералом, указывающим значение 16, которое представлено формулой 10
в шестнадцатеричном формате (обозначается 0x
префикс).
Напротив, в x = cos(0)
, выражение cos(0)
оценивается как 1 (как косинус от 0), но значение 1 не буквально включено в исходный код . Проще говоря, в x = 2 + 2,
выражение 2 + 2
оценивается как 4, но значение 4 не включается буквально. Далее, в x = "1"
тот "1"
является строковым литералом , а не целочисленным литералом, поскольку он заключен в кавычки. Значение строки 1
, который является целочисленной строкой, но это семантический анализ строкового литерала – на синтаксическом уровне "1"
это просто строка, ничем не отличающаяся от "foo"
.
Разбор
[ редактировать ]Распознавание строки (последовательности символов в исходном коде) как целочисленного литерала является частью этапа лексического анализа (лексинга), а оценка литерала до его значения является частью этапа семантического анализа . В лексере и грамматике фраз класс токена часто обозначается integer
, где строчная буква указывает на класс токена лексического уровня, в отличие от правила производства на уровне фразы (например, ListOfIntegers
). После того как строка была лексизирована (токенизирована) как целочисленный литерал, ее значение не может быть определено синтаксически (это просто целое число), и оценка ее значения становится семантическим вопросом.
Целочисленные литералы обычно лексируются с помощью регулярных выражений , как в Python . [1]
Оценка
[ редактировать ]Как и другие литералы, целочисленные литералы обычно оцениваются во время компиляции, как часть фазы семантического анализа. В некоторых случаях этот семантический анализ выполняется в лексере сразу после распознавания целочисленного литерала, тогда как в других случаях он откладывается до этапа синтаксического анализа или до тех пор, пока дерево разбора не будет полностью построено. Например, при распознавании строки 0x10
лексер может немедленно оценить это значение как 16 и сохранить его (токен типа integer
и значение 16), или отложить оценку и вместо этого записать токен типа integer
и ценность 0x10
.
После оценки литералов дальнейший семантический анализ в форме свертывания констант возможен , что означает, что литеральные выражения, включающие литеральные значения, могут быть оценены на этапе компиляции. Например, в заявлении x = 2 + 2
после того, как литералы были вычислены и выражение 2 + 2
был проанализирован, затем его можно оценить как 4, хотя само значение 4 не отображается как литерал.
Аффиксы
[ редактировать ]Целочисленные литералы часто имеют префиксы, обозначающие основу, и реже суффиксы, обозначающие тип. [1] Например, в С++ 0x10ULL
указывает значение 16 (поскольку шестнадцатеричное) как длинное целое число без знака.
Общие префиксы включают:
0x
или0X
для шестнадцатеричного (основание 16);0
,0o
или0O
для восьмеричной (основание 8);0b
или0B
для двоичного кода (основание 2).
Общие суффиксы включают:
l
илиL
для длинного целого числа;ll
илиLL
для длинного целого числа;u
илиU
для беззнакового целого числа.
Эти аффиксы чем-то похожи на сигилы , хотя сигилы прикрепляются к идентификаторам (именам), а не к литералам.
Разделители цифр
[ редактировать ]В некоторых языках целочисленные литералы могут содержать разделители цифр, позволяющие группировать цифры в более разборчивые формы. Если это доступно, обычно это можно сделать и для литералов с плавающей запятой. Это особенно полезно для битовых полей и позволяет сразу увидеть размер больших чисел (например, миллиона) путем суббитизации, а не подсчета цифр. Это также полезно для номеров, которые обычно группируются, например, номера кредитных карт или номера социального страхования . [а] Очень длинные числа можно дополнительно сгруппировать, удвоив разделители.
Обычно десятичные числа (по основанию 10) группируются в группы из трех цифр (представляющие одно из 1000 возможных значений), двоичные числа (по основанию 2) в группы из четырех цифр (один полубайт , представляющий одно из 16 возможных значений) и шестнадцатеричные числа ( base-16) в двух группах цифр (каждая цифра — это один полубайт, поэтому две цифры — это один байт , представляющий одно из 256 возможных значений). Числа из других систем (например, идентификационные номера) группируются в соответствии с используемым соглашением.
Примеры
[ редактировать ]В Аде , [2] [3] C# (с версии 7.0), D , Eiffel , Go (с версии 1.13), [4] Haskell (начиная с версии GHC 8.6.1), [5] Java (начиная с версии 7), [6] Юлия , Perl , Python (с версии 3.6), [7] Руби , Ржавчина [8] и Свифт , [9] целочисленные литералы и литералы с плавающей запятой могут быть разделены подчеркиванием ( _
). Могут быть некоторые ограничения на размещение; например, в Java они не могут появляться в начале или конце литерала, а также рядом с десятичной точкой. Хотя точка, запятая и (тонкие) пробелы используются в обычном письме для разделения цифр, они противоречат их существующему использованию в языках программирования в качестве точки счисления , разделителя списков (а в C/C++ - оператора-запятой ) и разделителя токенов. .
Примеры включают в себя:
int oneMillion = 1_000_000;
int creditCardNumber = 1234_5678_9012_3456;
int socialSecurityNumber = 123_45_6789;
В C++14 (2014 г.) и следующей версии C по состоянию на 2022 г. [update], C23 , символ апострофа может использоваться для произвольного разделения цифр в числовых литералах. [10] [11] Первоначально подчеркивание было предложено в 1993 году. [12] и снова для C++11 , [13] следуя другим языкам. Однако это вызвало конфликт с определяемыми пользователем литералами , поэтому вместо него был предложен апостроф в виде « верхней запятой » (которая используется в некоторых других контекстах). [14] [15]
auto integer_literal = 1'000'000;
auto binary_literal = 0b0100'1100'0110;
auto very_long_binary_literal =
0b0000'0001'0010'0011''0100'0101'0110'0111;
Примечания
[ редактировать ]- ^ Однако обычно такие конфиденциальные числа не включаются в качестве литералов.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б " 2.4.4. Целые и длинные целые литералы "
- ^ «Справочное руководство по языку Ada '83: 2.4. Числовые литералы» .
- ^ « Обоснование разработки языка программирования Ada®»: 2.1 Лексическая структура» .
- ^ «Примечания к выпуску Go 1.13 — Изменения в языке» . Проверено 5 ноября 2020 г.
- ^ «Руководство пользователя компилятора Glasgow Haskell: 11.3.7. Числовые подчеркивания» . Проверено 31 января 2019 г.
- ^ «Подчеркивания в числовых литералах» . Проверено 12 августа 2015 г.
- ^ «Что нового в Python 3.6» .
- ^ «Литералы и операторы» . Проверено 15 ноября 2019 г.
- ^ «Язык программирования Swift: лексическая структура» .
- ^ Кроул, Лоуренс; Смит, Ричард; Снайдер, Джефф; Вандевурде, Давид (25 сентября 2013 г.). «N3781 Одинарные кавычки как разделитель цифр» (PDF) .
- ^ Аарон Боллман (15 декабря 2020 г.). «N2626: Разделители цифр» (PDF) .
- ^ Джон Макс Скаллер (26 марта 1993 г.). «N0259: Предложение разрешить двоичные литералы и некоторые другие небольшие изменения в главе 2: Лексические соглашения» (PDF) .
- ^ Кроул, Лоуренс (2 мая 2007 г.). «N2281: Разделители цифр» .
- ^ Вандевурде, Дэвид (21 сентября 2012 г.). «N3448: Безболезненное разделение цифр» (PDF) .
- ^ Кроул, Лоуренс (19 декабря 2012 г.). «N3499: Разделители цифр» .