Co oznacza słowo „dosłowny”?

80

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ą?

prodev42
źródło

Odpowiedzi:

117

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)

źródło
Niestety nie wiem, jak udaje mu się określić prymat. Skopiowałem to skądś, bo wyglądało fajnie
1
Nawet nie wiedziałem, że tak się stało: po prostu pomyślałem, że pokazanie dosłownego wyrażenia regularnego w ogóle to dobry pomysł.
Joel Coehoorn
4
„jakikolwiek zapis reprezentujący wartość w kodzie źródłowym” Definicje Wikipedii są obecnie odczytywane jak odniesienia dla ekspertów, którzy już wiedzą, a nie służą żadnemu celowi pedagogicznemu - co to znaczy „wyjaśnij, jak mam pięć lat”?
BKSpurgeon
2
@BKSpurgeon Zasadniczo kod, który reprezentuje wartość w programie zamiast mieć specjalne znaczenie dla programu do wykonania. Na przykład: 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ł.
avid_useR
82

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ą.

Joel Coehoorn
źródło
11
Uwielbiam sposób, w jaki to wyjaśniłeś, zamiast próbować pokazać, ile wiesz, w ten sposób wprowadzając w błąd początkujących. Potrzebujemy więcej ludzi takich jak ty.
Pan Smee
2
Łatwe i przekonujące. Dzięki
Johnny
16

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.

Ed S.
źródło
tak: literały nie mają nic wspólnego z przydziałem;)
To prawda, powinienem był wyjaśnić fakt, że używałem przypisania, aby zademonstrować, czym jest dosłowność.
Ed S.
12

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ć.

Matthew Crumley
źródło
6

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.

Bill the Lizard
źródło
5

Szybki przykład:

int my_int_var = 723;

723 - Ten zestaw znaków odnosi się do literalnej liczby całkowitej.

my_int_var - ten zestaw znaków odnosi się do zmiennej wartości całkowitej.

mbeckish
źródło
3

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.

Anthony D.
źródło
2

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.

HasaniH
źródło
2

Literał to „reprezentacja danych w kodzie źródłowym”.

Koray Tugay
źródło
1

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:\\"
Timothy Carter
źródło
0

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.

Mario Galic
źródło