Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c-operators.doc
Скачиваний:
8
Добавлен:
09.11.2019
Размер:
154.62 Кб
Скачать

Операции инкремента и декремента

Операции ++ (инкремент) и – (декремент) вызывают соответственно увеличение или уменьшение операнда на единицу. Необычность операций ++ и ---- состоит в том, что их можно использовать как префиксные, так и как постфиксные. Различие в выполнении этих двух вариантов операций заключается в том, что при префиксной записи значение операнда меняется до того как он используется, а при постфиксной записи — после использования операнда. Например, пусть a=2. Тогда после x=a++; x примет значение 2, а после вычисления x=++a; x будет присвоено 3.

Операции инкремента и декремента можно применять только к переменным любого типа, но не к выражениям.

Рассматриваемые операции обозначаются двумя символами, между которыми не должно быть пробела. Это относится и к другим двухсимвольным обозначениям операций: >=, += и т.д.

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

То есть, две инструкции в программе, имеющие вид

a++; и ++а;

равносильны по действию.

В одном выражении не рекомедуется смешивать использование переменной с операциями инкремента и декремента и без них, так как это может привести к непредсказуемому результату. Например, при i=1 выполнение инструкции

printf("%d %d",i,++i);

приводит к печати вместо предполагаемых 1 и 2, значений 2 и 2, так

как вначале вычисляются все аргументы, и только затем производится печать

(стандарт языка здесь никаких ограничений не накладывает).

Остальные унарные операции (!, sizeof и приведения типа) будут

рассмотрены позже.

Задание.

1. Что будет напечатано фрагментами программы, если начальное значение i=1?

a) printf("i=%d\n",i); б) printf("i=%d\n",i);

printf("i=%d\n",++i); printf("i=%d\n",i++);

printf("i=%d\n",i); printf("i=%d\n",i);

2. Какие значения получат переменные x,y,z после вычислений, если начальные значения переменных a=1, b=2?

x=a++-1;

y=a++ +++b;

z= a/++a;

Операции отношения и логические операции

В Си имеется четыре операции проверки отношений, которые образуют группу с приоритетом, меньшим чем у унарных и арифметических операций.

  • <

  • <=

  • >

  • >=,

Тесно связаны с ними операции проверки равенства == (равно) и != (не равно), у которых своя группа приоритета, причем ниже чем у операций отношения.

Распространенной ошибкой является использование знака "присвоить" = вместо "равно" ==. Операция "равно" не меняет значений операндов и тем самым принципиально отличается от "присвоить".

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

Все шесть приведенных операций используются для формирования логических выражений, описывающих некоторые условия и принимающих значения "истина" или "ложь". В Си нет специальных логических значений, вместо них приняты числовые: 1 - "истина", 0 - "ложь".

Сложные условия со значениями "истина" или "ложь" формируются с помощью двух логических связок:

&& логическое "и",

|| - логическое "или".

Приоритет операции && (логическое умножение) выше, чем у || (логическое сложение).

В логических выражениях используется также операция отрицания !.Значение "истина" она обращает в "ложь" и наоборот. Поэтому, если ее применить к переменной с нулевым значением, то результатом будет единица. Если же ее применить к переменной с любым ненулевым значением, то результатом будет 0.

В контексте логических выражений любое ненулевое значение (не только 1) истолковывается как "истина". Например, если x = 2 и y =3, то x && y дает результат "истина", т.е. 1.

Сложные логические выражения, состоящие из простых логических выражений со связками && и || между ними вычисляются слева направо до тех пор, пока не появиться возможность установить значение всего выражения в целом. Поэтому для получения значения сложного выражения не всегда необходимость вычислить все его операнды. Иногда может хватить даже одного. Например, если в выражении

e<.001 && c>100

первое отношение не выполняется, то второе вычислять не нужно: уже ясно, что значением всего выражения будет "ложь". Аналогично, если в выражении

e<.001 || c>100

первое отношение истинно, то истинно и все выражение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]