4.2 Дополнительные
операции.
Сейчас, на примере следующей
программы, рассмотрим некоторые новые операции,
аналогов которым нет в Паскале.
Программа, которую мы
рассмотрим, вычисляет и выводит на экран квадрат
числа 3.

Итак, наиболее замечательной
особенностью программы является применение инкрементного
оператора ++i. Именно
инкрементный оператор можно назвать визитной
карточкой языка Си.
Заметьте, что при объявлении
возможна инициализация объявленных переменных: p=1;.
С оператором цикла мы уже
знакомились. Он включает в себя: инициализацию
переменной цикла, проверку истинности условия
окончания цикла и изменение переменной.
Инициализация переменной
выполняется один раз, когда цикл начинает
выполняться. Проверка условия производится
перед выполнением каждой итерации. Изменение
переменной цикла вычисляется в конце каждого
выполнения тела цикла. В данном случае для
изменения переменной цикла i использован инкрементный оператор,
который является сокращённой формой следующей
записи: i=i+1;.
Напомним, что в языке Паскаль
существуют процедуры, позволяющие увеличить или
уменьшить на единицу значение целого аргумента.
Такие процедуры удобно использовать в циклах repeat-until и while-do. В
приведённом фрагменте можно увидеть
использование данных процедур.

В языке Си существуют
специальные операторы для изменения переменных.
Оператор p*=BASE;
увеличивает значение переменной p в BASE раз и,
тем самым, эквивалентен оператору p=p*BASE;. Лаконичность таких операторов
повышает наглядность программы. При работе с
циклами часто приходится увеличивать или
уменьшать некоторые переменные, используемые в
теле цикла, например счётчик. Для этих целей в
языке Си существует специальная операция
увеличения: ++. Она
изменяет значение своего операнда на единицу.
Сравните:

Существует две возможности
использования данной операции: символы ++
находятся слева от переменной – “префиксная
форма”; символы стоят справа от переменной
– “постфиксная форма”.
В рассмотренном примере
разницы между префиксной и постфиксной формой
операции увеличения не существует. Обе они
увеличивают значения переменных (операндов) на
единицу. Постфиксная и префиксная форма операции
увеличения отличаются между собой, только
тем, в какой момент осуществляется увеличение
операнда. Рассмотрим ещё один фрагмент:

iplus=i++ - постфиксная форма:
переменная i изменяется после
того, как её значение используется.
plusj=++j – префиксная форма:
переменная j изменяется перед
тем, как её значение используется.
Используя в программе
операторы увеличения, Вы делаете её более
компактной и изящной. Можно использовать её в
условии цикла while,
объединив в одном выражении два процесса:
проверка (продолжить или нет?); изменение
переменной, значение которой проверяется:

Внимание! Изменение постфиксной формы
операции на префиксную в условии цикла (Фрагмент
5), должно сопровождаться также, либо изменением
условия, либо изменением начальных значений
переменных.
Каждой операции увеличения
соответствует некоторая операция уменьшения,
при этом используются символы --.

--i – префиксная форма
операции уменьшения;
i-- - постфиксная форма
операции уменьшения.
В соответствии с принятым в
языке Си порядком вычислений, операции
увеличения и уменьшения имеют очень высокий
уровень старшинства. Только круглые скобки
обладают более высоким приоритетом. Это значит,
что выражение x*y++
означает (x)*(y++), а не (x+y)++ что очень удобно, т.к. последнее
выражение не имеет смысла (операции увеличения и
уменьшения применяются к переменным).
Однако не следует путать
старшинство операций с порядком вычислений.

Результат последней операции
будет выглядеть так: val=(2+3)*5=25. Дело в том, что значение переменной n увеличится до 4 только после того, как выражение
вычислено. Старшинство операции ++ имеет отношение только к n, кроме того, оно указывает, когда
значение переменной n
используется при вычислении выражения, но момент
изменения значения n
определяется семантикой данной операции.
Заметим, что в языке Си имеется
также сокращённая форма записи для увеличения
переменной на фиксированную величину. Например,
вместо выражения i=i+6;
можно записать: i+=6;. Знак += определяет аддитивную операцию
присваивания, в результате выполнения которой,
величина, стоящая справа, прибавляется к
значению переменной, расположенной слева.
Дополнительные операции
присваивания корректируют значения переменных,
в записи каждой из них имеются имя переменной,
стоящее слева от знака операции, и выражение
справа от него:

На месте правой части может
стоять и более сложное выражение:

Дополнительные операции
присваивания имеют такой же низкий приоритет,
как и операция присваивания, т.е. меньший, чем у
сложения и умножения.
Использовать дополнительные
операции присваивания совсем не обязательно,
однако они более компактны, и при трансляции
позволяют получить более эффективный код. |