Что означает слово «буквальный»? - PullRequest
69 голосов
/ 27 января 2009

Что означает слово «литерал» при использовании в контексте, таком как буквенные строки и буквальные значения?

В чем разница между литеральным значением и значением?

Ответы [ 11 ]

104 голосов
/ 27 января 2009

Литерал - это «любая нотация для , представляющая значение в исходном коде» ( wikipedia )

(Сравните это с идентификаторами , которые относятся к значению в памяти.)

Примеры:

  • "hey" (строка)
  • false (логическое значение)
  • 3.14 (действительное число)
  • [1,2,3] (список номеров)
  • (x) => x*x (функция)
  • /^1?$|^(11+?)\1+$/ (регулярное выражение)

Некоторые вещи, которые не являются литералами:

  • std::cout (идентификатор)
  • foo = 0; (выписка)
  • 1+2 (выражение)
73 голосов
/ 27 января 2009

Литерал - это значение, которое было жестко запрограммировано непосредственно в вашем источнике.

Например:

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; 

Что отличает их от переменных или ресурсов, так это то, что компилятор может обращаться с ними как с константами или выполнять определенные оптимизации с использованием кода, в котором они используются, поскольку он точно не изменится.

15 голосов
/ 27 января 2009

Литерал - это присвоение явного значения, такого как

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'

РЕДАКТИРОВАТЬ: Как указывалось, само присвоение не имеет ничего общего с определением литерала, я использовал присваивание в моем примере, но литерал также может быть передан в метод и т. Д.

9 голосов
/ 27 января 2009

Литерал - это когда вы включаете значение в исходный код (в отличие от ссылки на переменную или константу). Например:

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, если я пропускаю все остальные элементы в цикле. Если значение числа является более важным, чем его фактическое значение (обычно это так), лучше назвать его.

6 голосов
/ 27 января 2009

Литеральное значение является значением , но значение также может быть сохранено в переменной. В заявлении

string str = "string literal";

есть строковая переменная (str) и строковый литерал. После выполнения оператора они оба имеют одинаковое значение.

Имейте в виду, что во многих языках переменная и буквенное значение не обязательно должны быть одного типа. Например:

int a = 1.0;

Приведенное выше буквальное значение является типом с плавающей запятой. Значение будет приведено компилятором в соответствие с переменной int.

В другом примере, в первой строке кода C ++ над типом строкового литерала на самом деле не указан тип библиотеки string. Для обеспечения обратной совместимости с C строковые литералы в C ++ являются массивами символов.

4 голосов
/ 27 января 2009

Быстрый пример:

int my_int_var = 723;

723 - этот набор символов относится к буквальному целочисленному значению.

my_int_var - этот набор символов относится к переменной целочисленному значению.

3 голосов
/ 27 января 2009

Литерал - это когда вы помещаете его в код. Таким образом, строковый литерал

string s = "SomeText";

Это в отличие от построения строки или принятия ее в качестве параметра.

2 голосов
/ 28 января 2009

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

Другое распространенное использование - для значений, которые преобразуются в непосредственные значения в сборке. Это значения, которые вставляются непосредственно в машинную инструкцию, а не требуют загрузки регистров.

1 голос
/ 25 декабря 2016

Литерал - это «представление данных исходного кода».

1 голос
/ 27 января 2009

Я слышал, что строковые литералы используются случайно для обозначения того, что спецификация C # фактически называет буквальными строковыми литералами. Обычный строковый литерал позволяет экранировать определенные символы (с префиксом a), например, \ t для табуляции. Буквально-строковый литерал начинается с @ и обрабатывается дословно, \ не имеет особого значения.

//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"
...