En informática y programación de software , un valor es la representación de alguna entidad que puede ser manipulada por un programa. Los miembros de un tipo son los valores de ese tipo. [1]
El "valor de una variable" viene dado por la asignación correspondiente en el entorno . [2] En lenguajes con variables asignables , se hace necesario distinguir entre el valor r (o contenido) y el valor l (o ubicación) de una variable. [3]
En lenguajes declarativos (de alto nivel), los valores deben ser referencialmente transparentes . Esto significa que el valor resultante es independiente de la ubicación de la expresión necesaria para calcular el valor. Solo el contenido de la ubicación (los bits, ya sean 1 o 0) y su interpretación son significativos. [ cita requerida ]
A pesar de su nombre, en los estándares del lenguaje C++ esta terminología se utiliza para categorizar expresiones, no valores. [4] : 8.2.1
Algunos lenguajes utilizan la idea de valores l y valores r , que derivan del modo típico de evaluación en el lado izquierdo y derecho de una declaración de asignación. Un valor l se refiere a un objeto que persiste más allá de una sola expresión. Un valor r es un valor temporal que no persiste más allá de la expresión que lo utiliza. [5]
El concepto de valores l y valores r fue introducido por el lenguaje de programación combinado (CPL). Los conceptos de valor r, valor l y valor r/valor l en una expresión son análogos a los modos de parámetro de entrada (tiene un valor), parámetro de salida (puede asignarse) y parámetro de entrada/salida (tiene un valor y puede asignarse), aunque los detalles técnicos difieren entre contextos e idiomas.
En muchos lenguajes, en particular la familia C , los valores l tienen direcciones de almacenamiento a las que puede acceder programáticamente el programa que se está ejecutando (por ejemplo, mediante algún operador de dirección como "&" en C/C++), lo que significa que son variables o referencias desreferenciadas a una determinada ubicación de memoria. Los valores R pueden ser valores l (ver más abajo) o valores distintos de l, un término que solo se utiliza para distinguirlos de los valores l. Considere la expresión C. 4 + 9
Cuando se ejecuta, la computadora genera un valor entero de 13, pero como el programa no ha designado explícitamente en qué parte de la computadora se almacena este 13, la expresión no es un valor l. Por otro lado, si un programa C declara una variable x y asigna el valor de 13 a x, entonces la expresión x
tiene un valor de 13 y es un valor l.
En C, el término l-value originalmente significaba algo que podía ser asignado (de ahí el nombre, indicando que está en el lado izquierdo del operador de asignación), pero desde que la palabra reservada const
(constante) fue añadida al lenguaje, el término es ahora 'l-value modificable'. En C++11 existe un glifo semántico especial &&
(que no debe confundirse con el &&
operador usado para operaciones lógicas), para denotar el uso/acceso de la dirección de la expresión solo para el compilador ; es decir, la dirección no puede ser recuperada usando el operador address-of &
durante el tiempo de ejecución del programa (vea el uso de la semántica de movimiento ). La adición de la semántica de movimiento complicó la taxonomía de clasificación de valores al agregarle el concepto de un xvalue (valor que expira) que se refiere a un objeto cerca del final de su vida útil cuyos recursos pueden ser reutilizados (normalmente moviéndolos). Esto también condujo a la creación de las categorías glvalue (lvalue generalizado) que son lvalues y xvalues y prvalues (rvalues puros) que son rvalues que no son xvalues. [6]
Este tipo de referencia se puede aplicar a todos los valores r, incluidos los valores que no sean l, así como los valores l. Algunos procesadores proporcionan una o más instrucciones que toman un valor inmediato , a veces denominado "inmediato" para abreviar. Un valor inmediato se almacena como parte de la instrucción que lo emplea, generalmente para cargar, agregar o restar de un registro. Las otras partes de la instrucción son el código de operación y el destino. Este último puede ser implícito. (Un valor no inmediato puede residir en un registro o almacenarse en otra parte de la memoria, lo que requiere que la instrucción contenga una dirección directa o indirecta [por ejemplo, la dirección del registro de índice] al valor).
La expresión de valor l designa (se refiere a) un objeto. Un valor l no modificable es direccionable, pero no asignable. Un valor l modificable permite que el objeto designado se pueda cambiar y examinar. Un valor r es cualquier expresión, un valor distinto de l es cualquier expresión que no sea un valor l. Un ejemplo es un "valor inmediato" (ver arriba) y, en consecuencia, no es direccionable.
Un valor puede ser prácticamente cualquier tipo de datos de un tipo de datos determinado , por ejemplo, una cadena, un dígito o una sola letra.
Los procesadores suelen admitir más de un tamaño de datos inmediatos, por ejemplo, 8 o 16 bits, empleando un código de operación y un mnemónico únicos para cada variante de instrucción. Si un programador proporciona un valor de datos que no cabe, el ensamblador emite un mensaje de error "Fuera de rango". La mayoría de los ensambladores permiten que un valor inmediato se exprese como datos ASCII , decimales , hexadecimales , octales o binarios . Por lo tanto, el carácter ASCII 'A'
es el mismo que 65
o 0x41
. El orden de bytes de las cadenas puede diferir entre procesadores, según el ensamblador y la arquitectura de la computadora.