Введение

Выражение в информатике, которое нельзя вычислить далее.

В информатике и программировании значение – это представление некоторой сущности, с которой может оперировать программа. Элементы типа являются значениями этого типа. "Значение переменной" определяется соответствующим соответствием в окружении. В языках с переменными, которым можно присваивать значения, становится необходимо различать r-значение (или содержимое) и l-значение (или адрес) переменной. В декларативных (высокоуровневых) языках значения должны быть референциально прозрачными. Это означает, что результирующее значение не зависит от адреса выражения, необходимого для его вычисления. Значимы только содержимое адреса (биты, независимо от того, равны они 1 или 0) и их интерпретация.

Категория стоимости

Несмотря на своё название, в стандартах языка C++ эта терминология используется для классификации выражений, а не значений.

Присвоение: l-значения и r-значения

Некоторые языки используют понятия l-значений и r-значений, происходящих из типичного способа вычисления левой и правой части оператора присваивания. L-значение относится к объекту, существующему дольше, чем одно выражение. R-значение – это временное значение, которое не сохраняется после выражения, в котором оно используется. Понятия l-значений и r-значений были введены в Комбинированном языке программирования (CPL). Понятия r-значения, l-значения и r-значения/l-значения в выражении аналогичны режимам параметров: входного параметра (имеет значение), выходного параметра (может быть присвоено значение) и входного/выходного параметра (имеет значение и может быть присвоено значение), хотя технические детали различаются в зависимости от контекста и языка.

R-значения и адреса

Во многих языках, особенно в семействе C, l-значения имеют адреса хранения, которые программно доступны для выполняющейся программы (например, через оператор взятия адреса, такой как "&" в C/C++), что означает, что они являются переменными или разыменованными ссылками на определенное местоположение в памяти. R-значения могут быть l-значениями (см. ниже) или не-l-значениями – термин, используемый исключительно для различения от l-значений. Рассмотрим выражение в C. При выполнении компьютер генерирует целочисленное значение 13, но поскольку программа не указала, где в памяти хранится это число 13, выражение является не-l-значением. С другой стороны, если программа на C объявляет переменную x и присваивает ей значение 13, то выражение имеет значение 13 и является l-значением. В C термин l-value первоначально означал то, чему можно присвоить значение (отсюда и название, указывающее на его положение слева от оператора присваивания), но с добавлением в язык зарезервированного слова `const` (константа), термин теперь обозначает «изменяемое l-значение». В C++11 существует специальный семантический символ (не путать с оператором `&&`, используемым для логических операций) для обозначения использования/доступа к адресу выражения исключительно для компилятора; то есть, адрес нельзя получить с помощью оператора взятия адреса во время выполнения программы (см. использование семантики перемещения). Добавление семантики перемещения усложнило таксономию классификации значений, добавив понятие x-value (уходящее значение), которое относится к объекту, находящемуся близко к концу своего жизненного цикла, ресурсы которого могут быть повторно использованы (обычно путем перемещения). Это также привело к созданию категорий glvalue (обобщенное l-значение), которые включают l-значения и x-значения, и prvalue (чистое r-значение), которые являются r-значениями, не являющимися x-значениями. Этот тип ссылки может применяться ко всем r-значениям, включая не-l-значения, а также l-значения. Некоторые процессоры предоставляют одну или несколько инструкций, которые принимают непосредственное значение, иногда называемое просто «непосредственным». Непосредственное значение хранится как часть инструкции, которая его использует, обычно для загрузки в регистр, добавления к нему или вычитания из него. Другие части инструкции – это мнемоника (opcode) и пункт назначения. Последний может быть неявным. (Непосредственное значение может находиться в регистре или храниться в другом месте в памяти, требуя, чтобы инструкция содержала прямой или косвенный адрес [например, адрес индексного регистра] к этому значению.) Выражение l-value обозначает (ссылается на) объект. Неизменяемое l-значение адресуемо, но ему нельзя присвоить значение. Изменяемое l-значение позволяет изменять и просматривать указанный объект. R-значение – это любое выражение, а не-l-значение – любое выражение, которое не является l-значением. Примером является «непосредственное значение» (см. выше) и, следовательно, оно не адресуемо.

На языке ассамблеи

Значение может быть практически любым типом данных, соответствующим заданному типу, например, строкой, цифрой или отдельной буквой. Процессоры часто поддерживают несколько размеров непосредственных данных, например, 8 или 16 бит, используя уникальный опкод и мнемонику для каждого варианта инструкции. Если программист предоставит значение, которое не помещается в заданный размер, ассемблер выдаст сообщение об ошибке "Out of range". Большинство ассемблеров позволяют задавать непосредственные значения в виде ASCII, десятичных, шестнадцатеричных, восьмеричных или двоичных данных. Таким образом, ASCII-символ эквивалентен или . Порядок байтов строк может различаться между процессорами в зависимости от ассемблера и архитектуры компьютера.