Целочисленный литерал - Integer literal

В Информатика, целочисленный литерал это своего рода буквальный для целое число чей ценить непосредственно представлен в исходный код. Например, в операторе присваивания х = 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 (потому что оно шестнадцатеричное) как длинное длинное целое число без знака.

Общие префиксы включают:

Общие суффиксы включают:

  • л или же 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;

Примечания

  1. ^ Однако обычно чувствительные числа, подобные этим, не включаются как литералы.

Рекомендации

  1. ^ а б "2.4.4. Целочисленные и длинные целочисленные литералы "
  2. ^ "Справочное руководство по языку Ada '83: 2.4. Числовые литералы".
  3. ^ ""Обоснование разработки языка программирования Ada® ": 2.1 Лексическая структура".
  4. ^ «Примечания к выпуску Go 1.13 - изменения языка». Получено 2020-11-05.
  5. ^ "Руководство пользователя компилятора Glasgow Haskell: 11.3.7. Числовые подчеркивания". Получено 2019-01-31.
  6. ^ «Подчеркивание в числовых литералах». Получено 2015-08-12.
  7. ^ «Что нового в Python 3.6».
  8. ^ «Литералы и операторы». Получено 2019-11-15.
  9. ^ «Быстрый язык программирования: лексическая структура».
  10. ^ Краул, Лоуренс; Смит, Ричард; Снайдер, Джефф; Вандевурде, Дэвид (25 сентября 2013 г.). «Одинарные кавычки N3781 в качестве разделителя цифр» (PDF).
  11. ^ Джон Макс Скаллер (26 марта 1993 г.). «N0259: Предложение разрешить двоичные литералы и некоторые другие небольшие изменения в главе 2: лексические соглашения» (PDF).
  12. ^ Лоуренс Кроул (2007-05-02). «N2281: Разделители цифр».
  13. ^ Дэвид Вандевурд (21 сентября 2012 г.). «N3448: Безболезненное разделение цифр» (PDF).
  14. ^ Лоуренс Кроул (19 декабря 2012 г.). «N3499: Разделители цифр».