Що означає слово "літерал", коли воно використовується в такому контексті, як літеральні рядки та значення літералу?
У чому різниця між буквальним значенням і значенням?
Відповіді:
Буквал - це "будь-яке позначення для представлення значення у вихідному коді" ( wikipedia )
(Порівняйте це з ідентифікаторами , які посилаються на значення в пам'яті.)
Приклади:
"hey"
(рядок)false
(логічне значення)3.14
(дійсне число)[1,2,3]
(список номерів)(x) => x*x
(функція)/^1?$|^(11+?)\1+$/
(регулярний вираз)Деякі речі, які не є буквальними:
std::cout
(ідентифікатор)foo = 0;
(заява)1+2
(вираз)15
буквально означає п'ятнадцять у програмі проти, +
що має особливе значення "скласти дві речі разом". Ви не ставитесь +
до того, що представляє сам знак плюс, оскільки він не є буквальним.
Літерал - це значення, яке було закодовано безпосередньо у вашому джерелі.
Наприклад:
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'
EDIT: Як зазначалося, саме призначення не має нічого спільного з визначенням літералу, я використовував призначення у своєму прикладі, але літерал також може бути переданий у метод тощо.
Буквальний - це коли ви включаєте значення у вихідний код (на відміну від посилання на змінну або константу). Наприклад:
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, якщо я пропускаю кожен інший елемент у циклі. Якщо значення числа важливіше його фактичного значення (воно зазвичай є), краще назвати його.
Буквальне значення - це значення, але значення також може зберігатися у змінній. У заяві
string str = "string literal";
є рядкова змінна (str) та рядковий літерал. Після виконання оператора вони обидва мають однакове значення.
Майте на увазі, що у багатьох мовах змінна та літеральне значення не обов’язково навіть повинні бути одного типу. Наприклад:
int a = 1.0;
Буквальне значення вище - тип із плаваючою комою. Значення буде примушене компілятором, щоб воно вмістилося до змінної int.
Для іншого прикладу, у першому рядку коду С ++ вище тип рядкового літералу насправді взагалі не є типом бібліотеки string
. Для підтримки зворотної сумісності з C рядкові літерали в C ++ є масивами char.
Як правило, коли хтось вживає слово буквальний, він означає, що значення можна розшифрувати з коду (тексту), як показано у багатьох прикладах в інших публікаціях.
Іншим поширеним використанням є значення, які перетворюються на безпосередні значення у збірці. Це значення, які вставляються безпосередньо в машинну інструкцію, а не вимагають навантажень реєстру.
Буквал - це "подання вихідного коду даних".
Я чув, що рядкові літерали випадково використовуються для посилання на те, що специфікація C # фактично позначає як дослівні рядкові літерали. Звичайний літеральний рядок дозволяє екранувати певні символи (префікс а), наприклад \ t для вкладки. Дослівний літеральний рядок дописується символом @ і обробляється дослівно, \ не має особливого значення.
//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"
Літерали - це скорочене позначення значень певних типів, яке мова вважає настільки важливим чи фундаментальним, що саме для них він виділив синтаксис цукру.
Приклад типів, значення яких часто представлені літералами:
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
справді однозначно позначається з використанням послідовності символів, однак значення не подається за допомогою спеціального скороченого літералу, а використовує загальні (багатослівні) умовні механізми для позначення значень будь-якого типу класу.
Термін літерал є синонімом значення термін , екземпляр , константа , член та елемент типу, але несе в собі трохи додаткового значення, яке говорить нам, що існує скорочення для запису.
Мені подобається думати про літерали як про єгипетські ієрогліфи, на відміну від набору символів з алфавіту для вираження концепції.