Co oznacza słowo „dosłowny”, gdy jest używane w kontekście, takim jak ciągi literałów i wartości literalne?
Jaka jest różnica między wartością literalną a wartością?
Odpowiedzi:
Literał to „dowolna notacja reprezentująca wartość w kodzie źródłowym” ( wikipedia )
(Porównaj to z identyfikatorami , które odnoszą się do wartości w pamięci.)
Przykłady:
"hey"
(ciąg)false
(wartość logiczna)3.14
(liczba rzeczywista)[1,2,3]
(lista numerów)(x) => x*x
(funkcja)/^1?$|^(11+?)\1+$/
(wyrażenie regularne)Niektóre rzeczy, które nie są dosłowne:
std::cout
(identyfikator)foo = 0;
(oświadczenie)1+2
(ekspresja)15
dosłownie oznacza piętnaście w programie, a +
które ma specjalne znaczenie „dodaj dwie rzeczy do siebie”. Nie traktowałbyś +
jako reprezentującego samego znaku plus, ponieważ nie jest to literał.
Literał to wartość, która została zakodowana bezpośrednio w twoim źródle.
Na przykład:
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
Niektóre literały mogą mieć specjalną składnię, dzięki czemu wiesz, jakiego typu jest to literał:
//The 'M' in 10000000M means this is a decimal value, rather than int or double.
var accountBalance = 10000000M;
To, co odróżnia je od zmiennych lub zasobów, polega na tym, że kompilator może traktować je jako stałe lub wykonywać pewne optymalizacje z kodem, w którym są używane, ponieważ jest pewne, że się nie zmienią.
Literał to przypisanie do jawnej wartości, takiej jak
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'
EDYCJA: Jak wskazałem, samo przypisanie nie ma nic wspólnego z definicją literału, w moim przykładzie użyłem przypisania, ale literał można również przekazać do metody itp.
Literał to umieszczenie wartości w kodzie źródłowym (w przeciwieństwie do odwoływania się do zmiennej lub stałej). Na przykład:
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)
Jeśli literał reprezentuje jakąś wielkość, na przykład stałą fizyczną, lepiej nadać mu nazwę, zamiast pisać ten sam literał wszędzie, gdzie jest to potrzebne. W ten sposób czytając kod źródłowy wiesz, co oznacza liczba , która zwykle jest ważniejsza niż jej wartość (która i tak może się zmienić).
const int maxUsers = 100;
const double gravitationalAcceleration = 9.8;
Ogólnie rzecz biorąc, jedynymi literałami numerycznymi, których używam (poza inicjalizacją stałych, jak powyżej), są 0 lub 1, a czasami 2, jeśli pomijam każdy inny element w pętli. Jeśli znaczenie liczby jest ważniejsze niż jej rzeczywista wartość (zwykle jest), lepiej ją nazwać.
Wartość literału to wartość, ale wartość może być również przechowywana w zmiennej. W oświadczeniu
string str = "string literal";
jest zmienna łańcuchowa (str) i literał łańcuchowy. Po wykonaniu instrukcji obie mają tę samą wartość.
Należy pamiętać, że w wielu językach zmienna i wartość literalna niekoniecznie muszą być nawet tego samego typu. Na przykład:
int a = 1.0;
Powyższa wartość literału jest typem zmiennoprzecinkowym. Wartość zostanie wymuszona przez kompilator w celu dopasowania do zmiennej int.
Na przykład, w pierwszym wierszu kodu C ++ powyżej typ literału ciągu nie jest w rzeczywistości typem biblioteki string
. Aby zachować zgodność wsteczną z C, literały ciągów w C ++ są tablicami char.
Literał występuje wtedy, gdy umieścisz go w kodzie. Tak więc literał ciągu to
string s = "SomeText";
Jest to w przeciwieństwie do budowania łańcucha lub przyjmowania go jako parametru.
Generalnie, gdy ktoś używa słowa dosłowne, oznacza to, że wartość jest możliwa do odczytania z kodu (tekstu), jak pokazano w wielu przykładach w innych postach.
Innym typowym zastosowaniem są wartości, które są konwertowane na wartości bezpośrednie w zestawie. Są to wartości, które są wstawiane bezpośrednio do instrukcji maszynowej, a nie wymagają ładowania rejestrów.
Literał to „reprezentacja danych w kodzie źródłowym”.
Słyszałem, że literały łańcuchowe używane przypadkowo w odniesieniu do tego, co specyfikacja C # faktycznie odnosi się do literałów ciągów dosłownych. Zwykły literał łańcuchowy pozwala na unikanie pewnych znaków (poprzedzonych a), takich jak \ t dla tabulatora. Dosłowny literał ciągu jest poprzedzony znakiem @ i przetwarzany dosłownie, \ nie ma specjalnego znaczenia.
//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"
Literały to skrócona notacja wartości w pewnych typach, które język uważa za tak ważne lub fundamentalne, że specjalnie dla nich wyznaczył cukier składniowy.
Przykładowe typy, których wartości są często reprezentowane przez literały:
Boolean = { true, false }
Integer = { ..., -2, -1, 0, 1, 2, ... }
Character = { 'a', 'b', ... }
String = { "hello", "world", ... }
Niektóre języki mają literały nawet dla typów funkcji:
Integer -> Integer = { (x: Integer) => x + 2), (x: Integer) => x/2, ...}
Przykładem wartości, które zwykle nie są reprezentowane za pomocą literałów, byłyby wartości typów klas:
Car(brand: String, seats: Integer) = { Car("BMW", 5), Car("Ferrari", 2), ...}
Tutaj wartość Car("BMW", 5)
w typieCar
jest rzeczywiście jednoznacznie oznaczona za pomocą sekwencji symboli, jednak wartość nie jest reprezentowana przy użyciu dedykowanego skróconego literału, ale zamiast tego wykorzystuje ogólne (rozwlekłe) mechanizmy pojęciowe do oznaczania wartości dowolnego typu.
Termin literał jest synonimem terminów wartość , instancja , stała , element członkowski i element typu, ale niesie ze sobą dodatkowe znaczenie, które mówi nam, że istnieje skrót na zapisanie tego.
Lubię myśleć o literałach jako o egipskich hieroglifach, a nie o łączeniu znaków alfabetu w celu wyrażenia koncepcji.