Что означает слово "буквальный"?
Что означает слово "литерал" при использовании в контексте, таком как буквенные строки и буквальные значения?
В чем разница между буквальным значением и значением?
11 ответов
Литерал - это "любая нотация для представления значения в исходном коде" ( википедия).
(Сравните это с идентификаторами, которые относятся к значению в памяти.)
Примеры:
"hey"
(строка)false
(логическое)3.14
(реальное число)[1,2,3]
(список номеров)(x) => x*x
(функция)/^1?$|^(11+?)\1+$/
(регулярное выражение)
Некоторые вещи, которые не являются литералами:
std::cout
(идентификатор)foo = 0;
(заявление)1+2
(выражение)
Литерал - это значение, которое было жестко запрограммировано непосредственно в вашем источнике.
Например:
string x = "This is a literal";
int y = 2; // so is 2, but not y
int z = y + 4; // y and z are not literals, but 4 is
int a = 1 + 2; // 1 + 2 is not a literal (it is an expression), but 1 and 2 considered separately are literals
Некоторые литералы могут иметь специальный синтаксис, поэтому вы знаете, какой тип литерала:
//The 'M' in 10000000M means this is a decimal value, rather than int or double.
var accountBalance = 10000000M;
Что отличает их от переменных или ресурсов, так это то, что компилятор может обращаться с ними как с константами или выполнять определенные оптимизации с использованием кода, в котором они используются, поскольку он точно не изменится.
Литерал - это присвоение явного значения, такого как
int i = 4; // i is assigned the literal value of '4'
int j = i // j is assigned the value of i. Since i is a variable,
//it can change and is not a 'literal'
РЕДАКТИРОВАТЬ: Как указывалось, само присваивание не имеет ничего общего с определением литерала, я использовал присваивание в моем примере, но литерал также может быть передан в метод и т. Д.
Литерал - это когда вы включаете значение в исходный код (в отличие от ссылки на переменную или константу). Например:
int result = a + 5; // a is a variable with a value, 5 is a literal
string name = "Jeff Atwood"; // name is a variable initialized
// with the string literal, "Jeff Atwood"
int[] array = new int[] {1, 2, 3}; // C# has array literals (this is actually three
// int literals within an array literal)
Если литерал представляет некоторую величину, например физическую константу, лучше дать ему имя, а не писать один и тот же литерал везде, где вам это нужно. Таким образом, когда вы читаете исходный код, вы знаете, что означает число, которое обычно важнее его значения (которое может измениться в любом случае).
const int maxUsers = 100;
const double gravitationalAcceleration = 9.8;
Как правило, единственные числовые литералы, которые я использую (помимо инициализации констант, как указано выше), это 0 или 1, а иногда и 2, если я пропускаю все остальные элементы в цикле. Если значение числа является более важным, чем его фактическое значение (обычно оно есть), лучше назвать его.
В программировании значение записывается именно так, как оно должно быть интерпретировано. Напротив, переменная - это имя, которое может представлять различные значения во время выполнения программы. А константа - это имя, представляющее одно и то же значение в программе. Но литерал - это не имя, а само значение.
Литерал может быть числом, символом или строкой. Например, в выражении
х = 3
х - переменная, а 3 - литерал.
Литеральное значение - это значение, но значение также может храниться в переменной. В заявлении
string str = "string literal";
есть строковая переменная (str) и строковый литерал. После выполнения оператора они оба имеют одинаковое значение.
Помните, что во многих языках переменная и буквальное значение не обязательно должны быть одного типа. Например:
int a = 1.0;
Приведенное выше буквальное значение является типом с плавающей запятой. Значение будет приведено компилятором в соответствие с переменной int.
Для другого примера, в первой строке кода C++ выше тип строкового литерала на самом деле не является типом библиотеки string
совсем. Для обеспечения обратной совместимости с C строковые литералы в C++ являются массивами символов.
Быстрый пример:
int my_int_var = 723;
723 - Этот набор символов относится к буквальному целочисленному значению.
my_int_var - этот набор символов относится к целочисленному значению переменной.
Литерал - это когда вы помещаете его в код. Таким образом, строковый литерал
string s = "SomeText";
Это в отличие от построения строки или принятия ее в качестве параметра.
Обычно, когда кто-то использует слово литерал, это означает, что значение можно расшифровать из кода (текста), как показано во многих примерах в других публикациях.
Другое распространенное использование для значений, которые преобразуются в непосредственные значения в сборке. Это значения, которые вставляются непосредственно в машинную инструкцию, а не требуют загрузки регистров.
Литералы - это условное обозначение значений в определенных типах, которые язык считает настолько важными или фундаментальными, что для них предусмотрен синтаксический сахар.
Пример типов, значения которых часто представлены литералами:
Boolean = { true, false }
Integer = { ..., -2, -1, 0, 1, 2, ... }
Character = { 'a', 'b', ... }
String = { "hello", "world", ... }
Некоторые языки имеют литералы даже для типов функций:
Integer -> Integer = { (x: Integer) => x + 2), (x: Integer) => x/2, ...}
Примером значений, которые обычно не представлены литералами, являются значения типов классов:
Car(brand: String, seats: Integer) = { Car("BMW", 5), Car("Ferrari", 2), ...}
Здесь значение Car("BMW", 5)
в типе Car
действительно однозначно обозначается с использованием последовательности символов, однако значение не представляется с использованием выделенного сокращенного литерала, а вместо этого использует общие (подробные) условные механизмы для обозначения значений любого типа класса.
Термин " литерал" является синонимом терминов " значение", " экземпляр", " константа", " член" и " элемент" типа, но несет в себе немного дополнительного значения, которое говорит нам, что для его записи есть сокращение.
Мне нравится думать о литералах как о египетских иероглифах, а не как о соединении букв алфавита, чтобы выразить концепцию.
Я слышал, что строковые литералы используются небрежно для обозначения того, что в спецификации C# фактически называется буквальными строковыми литералами. Обычный строковый литерал позволяет экранировать определенные символы (с префиксом a), например, \ t для табуляции. Буквально-строковый литерал начинается с @ и обрабатывается дословно, \ не имеет особого значения.
//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"