WikiDer > Целочисленный литерал
В Информатика, целочисленный литерал это своего рода буквальный для целое число чей ценить непосредственно представлен в исходный код. Например, в операторе присваивания х = 1
, Струна 1
является целочисленным литералом, указывающим значение 1, а в операторе х = 0x10
Струна 0x10
представляет собой целочисленный литерал, указывающий значение 16, которое представлено 10
в шестнадцатеричном формате (обозначается значком 0x
префикс).
Напротив, в х = соз (0)
, выражение соз (0)
оценивается в 1 (поскольку косинус 0), но значение 1 не в прямом смысле включены в исходный код. Проще говоря, в х = 2 + 2,
выражение 2 + 2
оценивается как 4, но значение 4 буквально не включается. Далее, в x = "1"
в "1"
это строковый литерал, а не целочисленный литерал, потому что он заключен в кавычки. Значение строки 1
, который оказывается целочисленной строкой, но это семантический анализ строкового литерала - на синтаксическом уровне "1"
это просто строка, не отличная от "фу"
.
Парсинг
Распознавание строки (последовательности символов в исходном коде) как целочисленного литерала является частью лексический анализ (lexing), в то время как оценка литерала его значения является частью семантический анализ фаза. В лексере и грамматике фраз класс лексемы часто обозначается целое число
, где строчные буквы указывают на класс лексемы лексического уровня, в отличие от правила производства на уровне фразы (например, ListOfIntegers
). После того, как строка была преобразована (токенизирована) как целочисленный литерал, ее значение не может быть определено синтаксически (это только целое число), и оценка его значения становится семантическим вопросом.
Целочисленные литералы обычно лексируются с обычные выражения, как в Python.[1]
Оценка
Как и другие литералы, целочисленные литералы обычно оцениваются во время компиляции, как часть фазы семантического анализа. В некоторых случаях этот семантический анализ выполняется в лексере сразу после распознавания целочисленного литерала, в то время как в других случаях он откладывается до этапа синтаксического анализа или до дерево синтаксического анализа полностью построен. Например, при распознавании строки 0x10
лексер может немедленно оценить это как 16 и сохранить это (токен типа целое число
и значение 16), или отложить оценку и вместо этого записать токен типа целое число
и ценность 0x10
.
После того, как литералы были оценены, дальнейший семантический анализ в форме постоянное сворачивание возможно, что означает, что литеральные выражения, содержащие литеральные значения, могут быть оценены на этапе компиляции. Например, в заявлении х = 2 + 2
после того, как литералы были оценены и выражение 2 + 2
был проанализирован, затем его можно оценить как 4, хотя само значение 4 не появляется как литерал.
Аффиксы
Целочисленные литералы часто имеют префиксы, указывающие основание, и реже суффиксы, указывающие тип.[1] Например, в C ++ 0x10ULL
указывает значение 16 (потому что оно шестнадцатеричное) как длинное длинное целое число без знака.
Общие префиксы включают:
0x
или же0X
за шестнадцатеричный (база 16);0
,0o
или же0O
за восьмеричный (база 8);0b
или же0B
за двоичный (база 2).
Общие суффиксы включают:
л
или жеL
для длинного целого числа;ll
или жеLL
для длинного целого числа;ты
или жеU
для целого числа без знака.
Эти аффиксы чем-то похожи на сигилы, хотя сигилы прикрепляются к идентификаторам (именам), а не к литералам.
Разделители цифр
В некоторых языках целочисленные литералы могут содержать разделители цифр, позволяющие группировка цифр в более разборчивые формы. Если это доступно, то обычно это можно сделать и для литералов с плавающей запятой. Это особенно полезно для битовые поля и упрощает определение размера больших чисел (например, миллиона) с первого взгляда субитизирующий вместо того, чтобы считать цифры. Это также полезно для чисел, которые обычно сгруппированы, например Номер кредитной карты или же номера социального страхования.[а] Очень длинные числа можно сгруппировать, удвоив разделители.
Обычно десятичные числа (основание-10) сгруппированы в трехзначные группы (представляющие одно из 1000 возможных значений), двоичные числа (основание-2) - четырехзначные группы (один клев, представляющий одно из 16 возможных значений) и шестнадцатеричные числа (base-16) в двухзначных группах (каждая цифра - это один полубайт, поэтому две цифры равны одному байт, представляющий одно из 256 возможных значений). Номера из других систем (например, идентификационные номера) группируются в соответствии с используемым соглашением.
Примеры
В Ада,[2][3] C # (с версии 7.0), D, Эйфель, Идти (с версии 1.13),[4] Haskell (из GHC версии 8.6.1),[5] Ява (с версии 7),[6] Юля, Perl, Python (с версии 3.6),[7] Рубин, Ржавчина[8] и Быстрый,[9] целочисленные литералы и литералы с плавающей запятой могут быть разделены подчеркивать (_
). Могут быть некоторые ограничения по размещению; например, в Java они не могут появляться ни в начале, ни в конце литерала, ни рядом с десятичной точкой. Обратите внимание, что хотя точка, запятая и (тонкие) пробелы используются в обычном письме для разделения цифр, они противоречат их существующему использованию в языках программирования как точка счисления, разделитель списка (а в C / C ++ оператор запятой) и разделитель токенов.
Примеры включают:
int один миллион = 1_000_000;int Номер кредитной карты = 1234_5678_9012_3456;int ИНН = 123_45_6789;
В C ++ 14 (2014), символ апострофа может использоваться для произвольного разделения цифр в числовых литералах.[10] Подчеркивание было первоначально предложено, с первоначальным предложением в 1993 году:[11] и снова для C ++ 11,[12] следующие другие языки. Однако это вызвало конфликт с определяемые пользователем литералы, поэтому вместо него был предложен апостроф как "верхняя запятая"(который используется в некоторых других контекстах).[13][14]
авто integer_literal = 1'000'000;авто binary_literal = 0b0100'1100'0110;авто 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 - изменения языка». Получено 2020-11-05.
- ^ "Руководство пользователя компилятора Glasgow Haskell: 11.3.7. Числовые подчеркивания". Получено 2019-01-31.
- ^ «Подчеркивание в числовых литералах». Получено 2015-08-12.
- ^ «Что нового в Python 3.6».
- ^ «Литералы и операторы». Получено 2019-11-15.
- ^ «Быстрый язык программирования: лексическая структура».
- ^ Краул, Лоуренс; Смит, Ричард; Снайдер, Джефф; Вандевурде, Дэвид (25 сентября 2013 г.). «Одинарные кавычки N3781 в качестве разделителя цифр» (PDF).
- ^ Джон Макс Скаллер (26 марта 1993 г.). «N0259: Предложение разрешить двоичные литералы и некоторые другие небольшие изменения в главе 2: лексические соглашения» (PDF).
- ^ Лоуренс Кроул (2007-05-02). «N2281: Разделители цифр».
- ^ Дэвид Вандевурд (21 сентября 2012 г.). «N3448: Безболезненное разделение цифр» (PDF).
- ^ Лоуренс Кроул (19 декабря 2012 г.). «N3499: Разделители цифр».