Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Lvalue-выражения

Операция присваивания означает, что значение правого операнда должно быть присвоено участку памяти, поименованному левым операндом. Поэтому левый операнд операции присваивания (или операнд унарного выражения присваивания) должен быть выражением, ссылающимся на участок памяти. Выражение, которое ссылается на участок памяти, называется Lvalue-выражением. Имя переменной является таким выражением: имя переменной указывает на участок памяти, а значением переменной является значение, находящееся в этой памяти.

Lvalue-выражениями могут быть:

  • Идентификаторы символьного, целого, плавающего, адресного, перечисляющего,структурного и совмещающего типов;

  • индексные ([]) выражения, исключая индексные выражения, вычисляющие указатель на массив или указатель на функцию;

  • выражение выбора структурного элемента (-> и .), если выбранный элемент является одним из вышеперечисленных выражений;

  • выражение унарной разадресации (*), за исключением выражений, ссылающихся на массив или функцию;

  • typecastдля адресных типов;

  • Lvalue-выражение в скобках.

      1. Унарные инкремент и декремент

Унарная операция присваивания (++ и --) инкрементирует или декрементирует свой операнд. Операнд должен быть целого, плавающего или адресного типа. В качестве операнда допустимо также Lvalue-выражение. Операнды целого или плавающего типа преобразуются путем сложения или вычитания целой 1. Тип результата соответствует типу операнда. Операнд адресного типа инкрементируется или декрементируется размером объекта, который он адресует. Инкрементированный указатель адресует следующий объект, а декрементированный указатель - предыдущий.

Операции инкремента (++) или дектемента (--) могут появляться перед или после своего операнда. Когда операция является префиксом своего операнда, то операнд инкрементируется или дектементируется и его новое значение является результатом вычисления выражения. Когда операция является постфиксом своего операнда, то непосредственным результатом выражения является значение операнда перед его инкрементированием или декрементированием. После этого результат используется в контексте, а операнд инкрементируется или декрементируется.

Примеры

/* ... example 1 ... */

if (pos++ > 0)

*ptt = *qtt;

/* ... example 2 ... */

if (line [--i] ! = '\n')

return;

В первом примере переменная pos сравнивается с 0, а затем инкрементируется.

Во втором примере переменная i декрементируется перед ее использованием в качестве индекса line.

      1. Простое присваивание

Операция простого присваивания (=) выполняет присваивание. Правый операнд присваивается левому операнду. При присваивании выполняются некоторые правила преобразования (смотри раздел 5.7.1).

Пример

double x;

int y;

x = y;

Значение y преобразуется к типу double и присваивается x.

      1. Составное присваивание

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

<expression 1> += <expression 2>

и может быть понято как:

<expression 1> = <expression 1> + <expression 2>

Однако, выражение составного присваивания не эквивалентно расширенной версии, поскольку в выражении составного присваивания <expression 1> вычисляется только один раз, в то время как в расширенной версии оно вычисляется дважды: в операции сложения и в операции присваивания. Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операций, и соответственно ограничивает типы своих операндов. Результатом операции составного присваивания является значение и тип левого операнда.

Пример

# define MASK 0xffff

n |= MASK

В этом примере операция побитового включающего ИЛИ выполняется на n и MASK и результат присваивается n. Константа MASK явно определенная директивой препроцессора # define.