¿Qué significa la palabra "literal"?

80

¿Qué significa la palabra "literal" cuando se usa en un contexto como cadenas literales y valores literales?

¿Cuál es la diferencia entre un valor literal y un valor?

prodev42
fuente

Respuestas:

117

Un literal es "cualquier notación para representar un valor dentro del código fuente" ( wikipedia )

(Compare esto con los identificadores , que se refieren a un valor en la memoria).

Ejemplos:

  • "hey" (una cuerda)
  • false (un booleano)
  • 3.14 (un número real)
  • [1,2,3] (una lista de números)
  • (x) => x*x (Una función)
  • /^1?$|^(11+?)\1+$/ (una expresión regular)

Algunas cosas que no son literales:

  • std::cout (un identificador)
  • foo = 0; (una declaración)
  • 1+2 (una expresión)

fuente
Lamentablemente, no sé cómo se las arregla para determinar la primacía. Lo copié de algún lado porque se veía genial
1
Ni siquiera sabía que eso era lo que hacía: pensé que mostrar una expresión regular literal era una buena idea.
Joel Coehoorn
4
"cualquier notación para representar un valor dentro del código fuente" Las definiciones de Wikipedia hoy en día se leen como referencias para los expertos que ya saben, en lugar de cumplir un propósito pedagógico, ¿qué se traduce lo anterior en "explica como si tuviera cinco años"?
BKSpurgeon
2
@BKSpurgeon Básicamente, código que representa un valor en un programa en lugar de tener un significado especial para que el programa lo ejecute. Por ejemplo: 15 literalmente significa quince en el programa vs +que tiene el significado especial de "sumar dos cosas". No lo trataría +como si representara el signo más en sí mismo, ya que no es un literal.
avid_useR
82

Un literal es un valor que se ha codificado directamente en su fuente.

Por ejemplo:

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

Algunos literales pueden tener una sintaxis especial, por lo que sabe de qué tipo es el literal:

//The 'M' in 10000000M means this is a decimal value, rather than int or double.
var accountBalance = 10000000M; 

Lo que los diferencia de las variables o los recursos es que el compilador puede tratarlos como constantes o realizar ciertas optimizaciones con el código donde se usan, porque es seguro que no cambiarán.

Joel Coehoorn
fuente
11
Me encanta la forma en que lo acaba de explicar, en lugar de tratar de mostrar cuánto sabe, confundiendo así a los novatos. Necesitamos más gente como tú.
Sr. Smee
2
Fácil y convincente. Gracias
Johnny
16

Un literal es una asignación a un valor explícito, como

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'

EDITAR: Como se señaló, la asignación en sí no tiene nada que ver con la definición de un literal, estaba usando asignación en mi ejemplo, pero un literal también se puede pasar a un método, etc.

Ed S.
fuente
sí: los literales no tienen nada que ver con la asignación;)
Eso es cierto, debería haber aclarado el hecho de que estaba usando la asignación para demostrar qué es un literal.
Ed S.
12

Un literal es cuando incluye el valor en el código fuente (en lugar de hacer referencia a una variable o una constante). Por ejemplo:

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)

Si el literal representa alguna cantidad, como una constante física, es mejor darle un nombre en lugar de escribir el mismo literal donde lo necesite. De esa manera, cuando lee el código fuente, sabe lo que significa el número , que suele ser más importante que su valor (que podría cambiar de todos modos).

const int maxUsers = 100;
const double gravitationalAcceleration = 9.8;

Generalmente, los únicos literales numéricos que uso (además de inicializar constantes como el anterior) son 0 o 1, y a veces 2 si me salto todos los demás elementos de un bucle. Si el significado del número es más importante que su valor real (normalmente lo es), es mejor nombrarlo.

Matthew Crumley
fuente
6

Un valor literal es un valor, pero un valor también se puede almacenar en una variable. En la declaración

string str = "string literal";

hay una variable de cadena (str) y una literal de cadena. Después de que se ejecuta la instrucción, ambos tienen el mismo valor.

Tenga en cuenta que en muchos idiomas la variable y el valor literal no tienen por qué ser necesariamente del mismo tipo. Por ejemplo:

int a = 1.0;

El valor literal anterior es un tipo de punto flotante. El compilador forzará el valor para que se ajuste a la variable int.

Para otro ejemplo, en la primera línea del código C ++ arriba el tipo de una cadena literal no es en realidad el tipo de biblioteca string. Para mantener la compatibilidad con versiones anteriores de C, los literales de cadena en C ++ son matrices de caracteres.

Bill el lagarto
fuente
5

Ejemplo rápido:

int my_int_var = 723;

723: este conjunto de caracteres se refiere a un valor entero literal .

my_int_var: este conjunto de caracteres se refiere a un valor entero variable .

mbeckish
fuente
3

Un literal es cuando lo pones en el código. Entonces una cadena literal es

string s = "SomeText";

Esto es en contraposición a construir la cadena o tomarla como parámetro.

Anthony D
fuente
2

Generalmente, cuando alguien usa la palabra literal, quiere decir que el valor es descifrable del código (texto) como se muestra en muchos de los ejemplos de otras publicaciones.

Otro uso común es para valores que se convierten en valores inmediatos en ensamblado. Estos son valores que se insertan directamente en la instrucción de la máquina en lugar de requerir cargas de registro.

HasaniH
fuente
2

Un literal es "representación de datos en código fuente".

Koray Tugay
fuente
1

He escuchado que los literales de cadena se usan casualmente para referirse a lo que la especificación C # realmente llama literales de cadena textuales. Un literal de cadena regular permite el escape de ciertos caracteres (con el prefijo a), como \ t para una pestaña. Un literal de cadena textual se antepone @ y se procesa literalmente, \ no tiene un significado especial.

//regular
string regular = "\thello world";
//verbatim
string verbatim = @"C:\";
//the regular equivalent of this would be "C:\\"
Timothy Carter
fuente
0

Los literales son una notación abreviada de valores en ciertos tipos que el lenguaje considera tan importantes o fundamentales que tiene una sintaxis dedicada solo para ellos.

Ejemplo de tipos cuyos valores a menudo se representan mediante literales:

Boolean = { true, false }
Integer = { ..., -2, -1, 0, 1, 2, ... }
Character = { 'a', 'b', ... }
String = { "hello", "world", ... }

Algunos lenguajes tienen literales incluso para tipos de funciones:

Integer -> Integer = { (x: Integer) => x + 2), (x: Integer) => x/2, ...}

Un ejemplo de valores que normalmente no se representan con literales serían valores de tipos de clase:

Car(brand: String, seats: Integer) = { Car("BMW", 5), Car("Ferrari", 2), ...}

Aquí, el valor Car("BMW", 5)en el tipo Carse denota de forma única usando una secuencia de símbolos, sin embargo, el valor no se representa usando un literal abreviado dedicado, sino que usa mecanismos nocionales generales (detallados) para denotar valores de cualquier tipo de clase.

El término literal es sinónimo de los términos valor , instancia , constante , miembro y elemento de un tipo, pero tiene un significado adicional que nos dice que hay una forma abreviada de escribirlo.

Me gusta pensar en los literales como jeroglíficos egipcios en lugar de encadenar caracteres de un alfabeto para expresar un concepto.

Mario Galic
fuente