Что означает слово «буквальный»?

80

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

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

prodev42
источник

Ответы:

117

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

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

Примеры:

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

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

  • std::cout (идентификатор)
  • foo = 0; (заявление)
  • 1+2 (выражение)

источник
К сожалению, я не знаю, как ему удается определить первозданность. Я просто скопировал его откуда-то, потому что это выглядело круто
1
Я даже не знал, что он сделал: я просто подумал, что показывать литерал регулярного выражения вообще было хорошей идеей.
Джоэл Коэхорн
4
«любая нотация для представления значения в исходном коде». В настоящее время определения в Википедии читаются как ссылки для экспертов, которые уже знают, а не служат какой-либо педагогической цели - что вышеизложенное переводится как «объясни, как будто мне пять»?
BKSpurgeon
2
@BKSpurgeon В основном это код, который представляет значение в программе вместо того, чтобы иметь особое значение для выполнения программы. Например: 15 буквально означает пятнадцать в программе vs, +что имеет особое значение «сложить две вещи вместе». Вы бы не стали рассматривать +как представление самого знака плюс, поскольку он не является буквальным.
avid_useR
82

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

Например:

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; 

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

Джоэл Кохорн
источник
11
Мне нравится, как вы только что это объяснили, вместо того, чтобы пытаться показать, как много вы знаете, тем самым сбивая с толку новичков. Нам нужно больше таких людей, как ты.
Мистер Сми
2
Легко и убедительно. Спасибо
Джонни
16

Литерал - это присвоение явному значению, например

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'

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

Эд С.
источник
ага: литералы не имеют ничего общего с присвоением;)
Это правда, мне следовало пояснить тот факт, что я использовал присваивание, чтобы продемонстрировать, что такое литерал.
Эд С.
12

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

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

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

string str = "string literal";

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

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

int a = 1.0;

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

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

Билл Ящерица
источник
5

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

int my_int_var = 723;

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

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

mbeckish
источник
3

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

string s = "SomeText";

Это противоположно построению строки или ее использованию в качестве параметра.

Энтони Д.
источник
2

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

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

ХасаниХ
источник
2

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

Корай Тугай
источник
1

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

//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"
Тимоти Картер
источник
0

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

Пример типов, значения которых часто представлены литералами:

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

Термин « литерал» является синонимом терминов « значение» , « экземпляр» , « константа» , « член» и « элемент типа», но несет в себе дополнительный смысл, который говорит нам о существовании сокращения для его записи.

Мне нравится думать о литералах как о египетских иероглифах, а не о соединении символов из алфавита для выражения концепции.

Марио Галич
источник