stringtranslate.com

Ценность (информатика)

В информатике и программировании значение это представление некоторой сущности, которой может манипулировать программа. Членами типа являются значения этого типа. [1]

«Значение переменной» задается соответствующим отображением в среде . [2] В языках с назначаемыми переменными становится необходимым различать r-значение (или содержимое) и l-значение (или местоположение) переменной. [3]

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

Категория значения

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

Задание: l-значения и r-значения

В некоторых языках используется идея l-значений и r-значений , происходящая из типичного способа вычисления в левой и правой части оператора присваивания. L-значение относится к объекту, который сохраняется за пределами одного выражения. R-значение — это временное значение, которое не сохраняется за пределами выражения, в котором оно используется. [5]

Понятие l-значений и r-значений было введено в Комбинированном языке программирования (CPL). Понятия в выражении r-значения, l-значения и r-значения/l-значения аналогичны режимам параметров входного параметра (имеет значение), выходного параметра (может быть назначен) и входного/выходного параметра. (имеет значение и может быть присвоено), хотя технические детали различаются в зависимости от контекста и языка.

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

Во многих языках, особенно в семействе C , l-значения имеют адреса хранения , которые программно доступны для работающей программы (например, через какой-либо оператор адреса, такой как «&» в C/C++), что означает, что они являются переменными или детерминантами. ссылочные ссылки на определенную ячейку памяти. R-значения могут быть l-значениями (см. ниже) или не-l-значениями — этот термин используется только для отличия от l-значений. Рассмотрим выражение 4 + 9C. При выполнении компьютер генерирует целое число 13, но поскольку программа явно не указала, где в компьютере хранится это число 13, выражение не является l-значением. С другой стороны, если программа на языке C объявляет переменную x и присваивает ей значение 13, то выражение xимеет значение 13 и является l-значением.

В C термин l-значение первоначально означал что-то, чему можно было присвоить (отсюда и название, указывающее на то, что оно находится слева от оператора присваивания), но поскольку в constязык было добавлено зарезервированное слово (константа), термин теперь является «изменяемым l-значением». В C++11 существует специальный семантический глиф &&(не путать с &&оператором, используемым для логических операций), обозначающий использование/доступ к адресу выражения только для компилятора ; т. е. адрес не может быть получен с помощью оператора адреса &во время выполнения программы (см. использование семантики перемещения ). Добавление семантики перемещения усложнило таксономию классификации значений, добавив к ней концепцию xvalue (значение с истекающим сроком действия), которое относится к объекту, срок службы которого приближается к концу, ресурсы которого можно использовать повторно (обычно путем их перемещения). Это также привело к созданию категорий glvalue (обобщенное lvalue), которые представляют собой lvalue и xvalues, и prvalues ​​(чистые rvalue), которые представляют собой rvalues, не являющиеся xvalues. [6]

Этот тип ссылки может применяться ко всем r-значениям, включая не-l-значения, а также l-значения. Некоторые процессоры предоставляют одну или несколько инструкций, которые принимают немедленное значение , иногда для краткости называемое «немедленным». Непосредственное значение сохраняется как часть инструкции, которая его использует, обычно для загрузки в регистр, добавления или вычитания из него. Другими частями инструкции являются код операции и пункт назначения. Последнее может быть неявным. (Непрямое значение может находиться в регистре или храниться в другом месте памяти, что требует, чтобы инструкция содержала прямой или косвенный адрес [например, адрес индексного регистра] к значению.)

Выражение l-значения обозначает объект (ссылается на него). Неизменяемое значение l адресно, но не назначаемо. Изменяемое значение l позволяет не только исследовать обозначенный объект, но и изменять его. Значение r — это любое выражение, значение, отличное от l, — это любое выражение, которое не является значением l. Одним из примеров является «непосредственное значение» (см. выше), которое, следовательно, не адресуется.

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

Значением может быть практически любой тип данных заданного типа , например строка, цифра или одна буква.

Процессоры часто поддерживают более одного размера непосредственных данных, например 8 или 16 бит, используя уникальный код операции и мнемонику для каждого варианта инструкции. Если программист предоставляет значение данных, которое не подходит, ассемблер выдает сообщение об ошибке «Вне диапазона». Большинство ассемблеров позволяют выражать непосредственное значение в виде ASCII , десятичных , шестнадцатеричных , восьмеричных или двоичных данных. Таким образом, символ ASCII 'A'аналогичен 65или 0x41. Порядок байтов строк может различаться на разных процессорах в зависимости от ассемблера и архитектуры компьютера.

Примечания

  1. ^ Митчелл 1996, с. 9.
  2. ^ Ахо, Альфред В.; Лам, Моника С.; Сетхи, Рави; Уллман, Джеффри Д. (1986). Составители: принципы, методы и инструменты . ISBN 0-201-10088-6.
  3. ^ Митчелл 1996, стр. 389–390.
  4. ^ «ISO/IEC 14882:2017 Языки программирования — C++». 2017.
  5. ^ «Значения L и значения R (Visual C++)» . Сеть разработчиков Microsoft . Проверено 3 сентября 2016 г.
  6. ^ Уильям М. Миллер. «Таксономия категорий значений выражений» (PDF) .

Рекомендации

Внешние ссылки