- •Действия: что делает программа Глава 2 Выражения
- •Арифметические операторы
- •Замечание
- •Операторы отношений
- •Логические операторы
- •Оператор отрицания
- •Операторы инкремента и декремента
- •Поразрядные операторы
- •Поразрядный оператор исключающего или
- •Сдвиг битов влево
- •Дополнение до единицы
- •Сомр 44 0х002с 0000000000101100
- •Операторы присваивания
- •Выражения значений
- •Приоритеты операторов
Оператор отрицания
Инвертируйте результат любого логического выражения с помощью унарного оператора отрицания !. Выражение
! (А < В)
("не верно, что А меньше В") эквивалентно выражению
(А >= В).
Оператор неравенства != связан с оператором отрицания. Выражение i
! (А == В)
("не верно, что А равно В") эквивалентно выражению
(А != В).
Это выражение истинно, только если А не равно В.
Операторы инкремента и декремента
Двумя самыми интригующими операторами языка С являются ++ (инкремент) и -- (декремент). Оператор ++ ("плюс плюс") прибавляет к операнду единицу. Оператор -- ("минус минус") вычитает единицу.
Несколько примеров проясняют, как работают эти важные операторы. Следующих два оператора дают идентичные результаты:
i = i + 1; /* прибавление единицы к i */
i++; /* то же самое */
Выражение i++ во второй строке является сокращенной записью более длинного выражения сложения и присваивания, приведенного в первой строке. Выражение i++ прибавляет единицу к текущему значению переменной i. Следующие два выражения также дают одинаковые результаты:
i = i - 1: /* вычитание единицы из i */
i--; /* то же самое •/
Выражение i-- вычитает единицу из i.
Кроме инкремента и декремента своих операндов, выражения, подобные i++ и i--, также имеют свои собственные значения, как и все другие выражения. Но эти значения зависят от расположения операторов ++ и --.
Если оператор следует за своим операндом, то значение выражения i++ или i-- равно значению i до модификации. Другими словами, оператор
j = i++;
присваивает переменной j значение переменной i, которое она имела до выполнения этого оператора. Например, если значение i равно 7, то после выполнения этого оператора значение i будет равно 8, а j получит значение 7.
Если же операторы инкремента и декремента предшествуют своим операндам, значение выражения будет равно значению операнда после модификации, т.е. оператор
j = ++i;
присваивает переменной j инкрементированное значение i, а также инкрементирует текущее значение i. Если значение i равно 7, то после выполнения этого оператора обе переменные j и i станут равными 8.
Чтобы лучше понять эти различия, можно обратиться к длинным формам записи выражений инкремента и декремента. Действие оператора
j = i++;
аналогично действию двух следующих операторов:
j = i;
i++;
А оператор
j = ++i;
действует подобно такой паре операторов:
++i;
j = i;
Листинг 2.2 демонстрирует действие операторов ++ и --. Скомпилируйте и запустите программу, затем введите целое значение и вы получите полную картину результатов применения операторов инкремента и декремента к этому значению.
Листинг 2.2. INCDEC.C (операции ++ и --)
__________________________________________________
1: include <stdio.h>
2:
3: main()
4: {
5: int a, b, с, v, k;
6:
7: printf("Enter an integer value: ");
8: scanf("%d", &v);
9: k = v;
10: printf("\n Before During After\n");
11: v=k; a=v; b= v++; с = v; printf("v++%8d%8d%8d\n", a, b, c);
12: v=k; a = v; b= v--; с = v; printf("v--%8d%8d%8d\n", a, b, c);
13: v = k; a=v; b= ++v; c = v; printf("++v%8d%8d%8d\n", a, b, c);
14: v=k; a=v; b= --v; c = v; printf("--v%8d%8d%8d\n", a, b, c);
15: return 0;
16: }
________________________________________________________
Если при выполнении программы вы введете целое число 8, то на дисплее будет выведена таблица значений, отображающая действие операторов инкремента и декремента:
Before( До ) During( Во время) After( После)
v++ 8 8 9
v-- 8 8 7
++v 8 9 9
--v 8 7 7
________________________________________________________
Рассмотрите внимательнее эти результаты. Колонка Веfоге (До) отображает значение переменной v перед вычислением выражения. Колонка During (Во время) показывает значение выражения (то, чему была бы равна переменная k, если бы, например, вы выполнили оператор k = v++;). Колонка After (После) показывает итоговое значение переменной v после вычисления выражения.
Использование функции scanf() в строке 8 несколько отличается от того, о котором шла речь в главе1. Оператор
scanf("%d", &v);
выполняет чтение десятичного целого значения ("%d") и сохраняет результат в переменной v. Выражение &v передает адрес переменной v функции scanf(). За исключением строковой переменной (как описано в главе1), аргументы в функцию scanf() могут передаваться только по адресу.