Простой оператор присваивания

Основное назначение оператора присваивания в языках программирования состоит в выполнении следующих операций:

● в запоминании в памяти входных данных и результатов вычислений некоторых выражений.

● в перемещении данных из одной области памяти в другую.

В языке Си присваивание имеет расширенное по сравнению с другими языками (Паскаль и Бейсик) назначение. Дело в том, что в языке Си может использоваться возвращаемое оператором присваивания значение. Это связано с тем обстоятельством, что присваивание в языке Си относится к категории операторов (operator), а не инструкций (statement), как это имеет место в других языках. Приведем пример, в котором используется значение, возвращаемое оператором присваивания.

 

#include<stdio.h>
#include<conio.h>
int main(void)
{
int x = 10;
inty = 20;
printf("%d\n", x = y);
/* ... */
getch();
return 0;
}

В этом программном коде вызов функции printf() используется для вывода на дисплей результата выполнения оператора присваивания.

Оператор присваивания относится к категории бинарных операторов. В качестве знака присваивания в языке Си используется математический знак равенства “=”. При выполнении оператора присваивания вначале вычисляется его правый операнд, затем вычисленное значение записывается в область памяти, адрес которой определяется его левым операндом. Требование знания адреса накладывает ограничения на выражение, которое может использоваться в качестве левого операнда присваивания. К левому операнду должна быть допустима операция взятия адреса. Выражения, допускающие применение этой операции, принято называть lvalue выражениями. Различают две категории lvalue выражений:

● изменяемые,

● неизменяемые.

В качестве левого операнда присваивания следует применять модифицируемое lvalue выражение.

Возвращаемым значением оператора присваивания является значение, записанное в его левый операнд. В книгах по языку Си и в сообщениях компилятора за левым операндом оператора присваивания закрепился термин lvalue (left side value), а за правым - rvalue (right side value) Таким образом, в общем случае простой оператор присваивания имеет следующий формат:

модифицируемое_lvalue_выражение = rvalue_выражение

Простейшим видом модифицируемого_lvalue_выражения является простая переменная, в объявлении которой отсутствует зарезервированное словоconst. К числу других допустимых выражений относятся выражения, используемые для доступа к элементам массивов и структур. В качестве правого операнда оператора присваивания может использоваться произвольное выражение, тип которого совместим по присваиванию с типом операнда, стоящего слева от знака присваивания. Все арифметические типы в языке Си совместимы по присваиванию.

Приведем примеры операторов присваивания. Пусть x и y – переменные, имеющие тип double. Тогда допустимы следующие операторы присваивания.

x = 4.5

y = x - 3

Отметим, что приведенные выше операторы присваивания становятся инструкциями присваивания, если в конце каждого из них поставить точку с запятой:

x = 4.5;
y = x - 3;

Приведем примеры некорректных присваиваний.

define MAX 100
const int n = 10;
int main(void)
{
n = 1; /* Ошибка */
MAX = 200; /* Ошибка */
return 0;
}

При компиляции этого программного кода в среде Builder v. 6 появились два сообщения об ошибках (error). Первое из них относилось к инструкции “n = 1;” и содержало следующее сообщение “Cannot modify const object” (Нельзя модифицировать константный объект). Второе сообщение было связано с инструкцией “MAX = 200;” и содержало сообщение “Lvalue required” (Lvalue требуется).