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

редактировать

На компьютере наука, целочисленный литерал представляет собой разновидность литерала для целого числа, значение которого напрямую представлено в исходном коде код. Например, в операторе присваивания 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".

Содержание
  • 1 Анализ
  • 2 Оценка
  • 3 Аффиксы
  • 4 Разделители цифр
    • 4.1 Примеры
  • 5 Примечания
  • 6 Ссылки
Анализ

Распознавание строки (последовательности символов в исходном коде) как целочисленного литерала является частью фазы лексического анализа (лексирования), в то время как оценка литерала по его значению выполняется часть этапа семантического анализа. В лексическом анализаторе и грамматике фраз класс лексемы часто обозначается целым числом, где строчные буквы указывают на класс лексики лексического уровня, в отличие от производственного правила на уровне фразы (например, ListOfIntegers). После того, как строка была преобразована (размечена) как целочисленный литерал, ее значение не может быть определено синтаксически (это просто целое число), и оценка ее значения становится семантическим вопросом.

Целочисленные литералы обычно лексируются с помощью регулярных выражений, как в Python.

Evaluation

Как и другие литералы, целочисленные литералы обычно оцениваются во время компиляции, как часть этапа семантического анализа. В некоторых случаях этот семантический анализ выполняется в лексере сразу после распознавания целочисленного литерала, в то время как в других случаях он откладывается до этапа синтаксического анализа или до тех пор, пока дерево синтаксического анализа не будет полностью построено. Например, при распознавании строки 0x10лексер может немедленно оценить это как 16 и сохранить это (токен типа integerи значение 16) или отложить оценку и вместо этого записать токен типа целое числои значение 0x10.

После того, как литералы были оценены, возможен дальнейший семантический анализ в форме сворачивания констант, что означает, что литеральные выражения, включающие литеральные значения, могут оцениваться на этапе компиляции. Например, в операторе x = 2 + 2после того, как литералы были оценены и выражение 2 + 2было проанализировано, оно может быть затем оценено как 4, хотя значение 4 сам по себе не является буквальным.

Аффиксы

Целочисленные литералы часто имеют префиксы, указывающие основание, и реже суффиксы, указывающие тип. Например, в C++ 0x10ULLуказывает значение 16 (потому что шестнадцатеричное) как длинное длинное целое число без знака.

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

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

  • lили Lдля длинного целого;
  • llили LLдля длинного длинного целого;
  • uили Uдля беззнакового целого.

Эти аффиксы чем-то похожи на сигилы, хотя сигилы прикрепляются к идентификаторам (именам), а не к литералам.

Разделители цифр

В некоторых языках целочисленные литералы могут содержать разделители цифр, позволяющие группировать цифры в более удобочитаемые формы. Если это доступно, то обычно это можно сделать и для литералов с плавающей запятой. Это особенно полезно для битовых полей и упрощает определение размера больших чисел (например, миллиона) с первого взгляда за счет субитизации, а не подсчета цифр. Это также полезно для номеров, которые обычно сгруппированы, например, или номера социального страхования. Очень длинные числа можно сгруппировать, удвоив разделители.

Обычно десятичные числа (основание-10) группируются в группы из трех цифр (представляющие одно из 1000 возможных значений), двоичные числа (основание-2) - в четырехзначные группы (один полубайт, представляет одно из 16 возможных значений) и шестнадцатеричные числа (base-16) в двухзначных группах (каждая цифра - это один полубайт, поэтому две цифры составляют один байт , представляющий одно из 256 возможных значений). Номера из других систем (например, идентификационные номера) группируются в соответствии с используемым соглашением.

Примеры

В Ada,C# (из версии 7.0), D, Eiffel, Haskell (из GHC версии 8.6.1), Java (с версии 7), Julia, Perl, Python (с версии 3.6), Ruby, Rust и Swift, целочисленные литералы и литералы с плавающей запятой могут быть разделены подчеркиванием (_). Могут быть некоторые ограничения по размещению; например, в Java они не могут появляться ни в начале, ни в конце литерала, ни рядом с десятичной точкой. Обратите внимание, что хотя точка, запятая и (тонкие) пробелы используются в обычном письме для разделения цифр, они противоречат их существующему использованию в языках программирования как точка счисления, разделитель списка (и в C / C ++, оператор запятой ) и разделитель токенов.

Примеры включают:

int oneMillion = 1_000_000; int creditCardNumber = 1234_5678_9012_3456; int socialSecurityNumber = 123_45_6789;

В C ++ 14 (2014) символ апострофа может использоваться для произвольного разделения цифр в числовых литералах. Подчеркивание было первоначально предложено с первоначальным предложением в 1993 году, а затем снова для C ++ 11, после других языков. Однако это вызвало конфликт с определяемыми пользователем литералами, поэтому вместо него был предложен апостроф в виде «верхней запятой » (которая используется в некоторых других контекстах).

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;
Примечания
Ссылки
Последняя правка сделана 2021-05-24 03:52:41
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте