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

Операция последовательного вычисления "," вычисляет два своих операнда последовательно слева направо. Результат операции имеет значение и тип второго операнда. Типы операндов не ограничиваются. Преобразования не выполняются.

Примеры:

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

for ( i = j = 1; i + j < 20; i += i, j --);

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

funk_one (x,y+2,z);

funk_two ((x--,y+2),z);

В первом примере каждый операнд третьего выражения оператора for вычисляется независимо. Левый операнд i+=i вычисляется первым, затем вычисляется j--.

Во втором примере показано, что символ "запятая" используется как разделитель в двух контекстах. В вызове функции funk_one три аргумента, разделенных запятыми, посылаются в вызываемую функцию: x, y+2,z. Использование симовола "запятая" как разделителя не нужно путать с ее использованием как операции. Оба использования совершенно различны.

В вызове функции funk_two скобки вынуждают компилятор интерпретировать первую запятую как операцию последовательного вычисления. Этот вызов функции посылает два аргумента к funk_two. Первый аргумент - это результат операции последовательного вычисления (x--,y+2), имеющий значение и тип выражения y+2 . Второй аргумент есть z.

      1. Условная операция

В Си есть одна тернарная операция - это условная операция "?:". Она имеет следующее синтаксическое представление:

<operand 1>?<operand 2>:<operand 3>

Выражение <operand 1> вычисляется с точки зрения его эквивалентности нулю. Оно может быть целого, плавающего или адресного типа. Если <operand 1> имеет ненулевое значение, то вычисляется <operand 2> и результатом условной операции является значение выражения <operand 2>. Если <operand 1> равен нулю, то вычисляется <operand 3> и результатом является значение выражения <operand 3>. Заметим, что вычисляется один из операндов <operand 2> или <operand 3>, но не оба.

Тип результата зависит от типов второго и третьего операндов следующим образом:

  1. Если второй и третий операнды имеют целый или плавающий тип (их типы могут быть отличны), то выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования.

  2. Второй и третий операнды могут быть одного и того же структурного, совмещения или адресного типа. Тип результата будет тем же самым типом структуры, совмещения или адреса.

  3. Один из второго или третьего операндов может быть указателем, а другой константным выражением со значением 0. Типом результата является адресный тип.

Пример

j = (i<0) ? (-i) : (i);

В примере j присваивается абсолютное значение i. Если i меньше нуля, то j присваивается -i. Если i больше или равно нулю, то j присваивается i.

    1. Операции присваивания

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

Операциями присваивания являются следующие:

Операция

Действие

++

Унарный инкремент

--

Унарный декремент

=

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

*=

Умножение с присваиванием

/=

Деление с присваиванием

%=

Остаток от деления с присваиванием

+=

Сложение с присваиванием

-=

Вычитание с присваиванием

<<=

Сдвиг влево с присваиванием

>>=

Сдвиг вправо с присваиванием

&=

Побитовое and с присваиванием

|=

Побитовое включающее ИЛИ с присваиванием

^=

Побитовое исключающее ИЛИ с присваиванием

При присваивании тип правого операнда преобразуется к типу левого операнда. Специфика преобразования детально описана в разделе 5.7.