В информатике и программировании значение — это представление некоторой сущности, которой может манипулировать программа. Члены типа — это значения этого типа. [1 ]
«Значение переменной» задается соответствующим отображением в среде . [2] В языках с назначаемыми переменными возникает необходимость различать r-значение (или содержимое) и l-значение (или местоположение) переменной. [3]
В декларативных (высокоуровневых) языках значения должны быть ссылочно прозрачными . Это означает, что результирующее значение не зависит от местоположения выражения, необходимого для вычисления значения. Значимым является только содержимое местоположения (биты, равны ли они 1 или 0) и их интерпретация. [ необходима цитата ]
Несмотря на свое название, в стандартах языка C++ эта терминология используется для категоризации выражений, а не значений. [4] : 8.2.1
Некоторые языки используют идею l-значений и r-значений , происходящую от типичного режима оценки на левой и правой стороне оператора присваивания. L-значение относится к объекту, который сохраняется за пределами одного выражения. R-значение — это временное значение, которое не сохраняется за пределами выражения, которое его использует. [5]
Понятие l-значений и r-значений было введено в Combined Programming Language (CPL). Понятия в выражении r-значения, l-значения и r-значения/l-значения аналогичны режимам параметров входного параметра (имеет значение), выходного параметра (может быть назначен) и входного/выходного параметра (имеет значение и может быть назначен), хотя технические детали различаются в зависимости от контекста и языка.
Во многих языках, особенно в семействе C , l-значения имеют адреса хранения , которые программно доступны для работающей программы (например, через некоторый оператор адреса, такой как "&" в C/C++), что означает, что они являются переменными или разыменованными ссылками на определенную область памяти. R-значения могут быть l-значениями (см. ниже) или не-l-значениями — термин, используемый только для отличия от l-значений. Рассмотрим выражение C. 4 + 9
При выполнении компьютер генерирует целочисленное значение 13, но поскольку программа явно не указала, где в компьютере хранится это 13, выражение не является l-значением. С другой стороны, если программа C объявляет переменную x и присваивает x значение 13, то выражение x
имеет значение 13 и является l-значением.
В языке C термин l-value изначально означал что-то, чему можно было присвоить значение (отсюда и название, указывающее на то, что оно находится слева от оператора присваивания), но с тех пор, как const
в язык было добавлено зарезервированное слово (константа), теперь этот термин называется «изменяемое l-value». В C++11 существует специальный семантический глиф &&
(не путать с &&
оператором, используемым для логических операций), обозначающий использование/доступ к адресу выражения только для компилятора ; т. е. адрес не может быть получен с помощью &
оператора address-of во время выполнения программы (см. использование семантики перемещения ). Добавление семантики перемещения усложнило таксономию классификации значений, добавив к ней концепцию xvalue (истекающего значения), которое относится к объекту, приближающемуся к концу своего жизненного цикла, ресурсы которого можно использовать повторно (обычно путем их перемещения). Это также привело к созданию категорий glvalue (обобщенное lvalue), которые являются lvalue и xvalue, и prvalues (чистые rvalue), которые являются rvalue, не являющимися xvalue. [6]
Этот тип ссылки может быть применен ко всем r-значениям, включая не-l-значения, а также l-значения. Некоторые процессоры предоставляют одну или несколько инструкций, которые принимают немедленное значение , иногда называемое для краткости «немедленным». Немедленное значение хранится как часть инструкции, которая его использует, обычно для загрузки в регистр, добавления к нему или вычитания из него. Другие части инструкции — это код операции и назначение. Последнее может быть неявным. (Не немедленное значение может находиться в регистре или храниться в другом месте памяти, требуя, чтобы инструкция содержала прямой или косвенный адрес [например, адрес индексного регистра] к значению.)
Выражение l-значения обозначает (относится к) объекту. Неизменяемое l-значение адресуемо, но не назначаемо. Изменяемое l-значение позволяет изменять и исследовать обозначенный объект. R-значение — это любое выражение, не-l-значение — это любое выражение, которое не является l-значением. Одним из примеров является «непосредственное значение» (см. выше) и, следовательно, не адресуемое.
Значением может быть практически любой вид данных заданного типа данных , например, строка, цифра, отдельная буква.
Процессоры часто поддерживают более одного размера непосредственных данных, например 8 или 16 бит, используя уникальный код операции и мнемонику для каждого варианта инструкции. Если программист предоставляет значение данных, которое не подходит, ассемблер выдает сообщение об ошибке «Вне диапазона». Большинство ассемблеров позволяют выражать непосредственные значения как ASCII , десятичные , шестнадцатеричные , восьмеричные или двоичные данные. Таким образом, символ ASCII 'A'
совпадает с 65
или 0x41
. Порядок байтов строк может различаться между процессорами в зависимости от ассемблера и архитектуры компьютера.