stringtranslate.com

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

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

Распространенные префиксы включают в себя:

Распространенные суффиксы включают в себя:

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

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

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

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

Примеры

В Ada , [2] [3] C# (с версии 7.0), D , Eiffel , Go (с версии 1.13), [4] Haskell (с версии GHC 8.6.1), [5] Java (с версии 7), [6] Julia , Perl , Python (с версии 3.6), [7] Ruby , Rust [8] и Swift , [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 года , C23 , символ апострофа может использоваться для произвольного разделения цифр в числовых литералах. [10] [11] Первоначально было предложено подчеркивание, первоначальное предложение было сделано в 1993 году, [12] а затем снова для C++11 , [13] вслед за другими языками. Однако это вызвало конфликт с определяемыми пользователем литералами , поэтому вместо него был предложен апостроф, как « верхняя запятая » (которая используется в некоторых других контекстах). [14] [15]

авто целочисленный_литерал = 1'000'000 ; авто двоичный_литерал = 0b0100'1100'0110 ; авто очень_длинный_бинарный_литерал = 0b0000'0001'0010'0011 '' 0100'0101'0110'0111 ;         

Примечания

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

Ссылки

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