ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4240
Скачиваний: 28
Часть I. Язык программирования С
56
В языке программирования С++ результатом оператора
,
может
быть и L-value, если оно является результатом вычисления второ-
го операнда.
Учитывая это замечание, в языке программирования С++ можно
написать следующее выражение:
int x = 1, y = 2, z;
x++, z = x - y; /* z = 0 */
На практике оператор
,
обычно используется там, где требуется
вычислить несколько выражений, хотя по синтаксису допускает-
ся запись только одного выражения. Например, цикл
for
может
быть инициализирован следующим образом:
for (i = 1, j = n; i < j; ++i, --j)
a[i] = b[j];
3.14. Побочные эффекты
Если при вычислении выражения значение переменной, входя-
щей в это выражение, изменяется, то говорят, что произошел
по-
бочный эффект
. Например, вычисление выражения:
++x - y
дает побочный эффект, т. к. при его вычислении изменяется зна-
чение переменной
x
. Но в этом случае результат вычисления вы-
ражения предсказуем, т. к. оператор инкремента имеет более вы-
сокий приоритет, чем оператор вычитания. Но если операторы
имеют одинаковый приоритет, то результат вычисления выраже-
ния может быть непредсказуемым, т. к. последовательность вы-
числения таких операторов не определена. Например, в языке
программирования С можно написать следующее выражение:
y = x++ + x--;
результат вычисления которого не определен. Побочные эффекты
также встречаются при использовании оператора индексирова-
ния, например:
x[i] = i++;
Глава 3. Операторы и выражения
57
И при вызове функций, например:
f(i + 1, ++i);
Таких ситуаций следует избегать, т. к. в этом случае работа про-
граммы будет зависеть от компилятора.
Отметим, что вычисление оператора присваивания всегда дает
побочный эффект, т. к. изменяется значение левого операнда это-
го оператора.
3.15. Точки последовательности
В языке программирования С при вычислении значения выраже-
ния определяются такие точки, до перехода через которые все
предыдущие вычисления должны быть завершены. Такие точки
называются
точками последовательности
(sequence points). Точ-
ки последовательности фиксируют побочные эффекты при вы-
числении значения выражения. Между точками последователь-
ности значение любого объекта должно модифицироваться толь-
ко один раз, в противном случае значение выражения не
определено. В языке программирования С определены следую-
щие точки последовательности при вычислении значения выра-
жения:
левый операнд логического оператора
&&
, т. е. вычисляется
значение левого операнда логического оператора
&&
, и если
оно равно 0, то дальнейших вычислений не происходит;
левый операнд логического оператора
||
, т. е. вычисляется
значение левого операнда логического оператора
||
, и если
оно равно 1, то дальнейших вычислений не происходит;
левый операнд оператора
,
(запятая), т. е. перед вычислением
правого операнда оператора
,
вычисление его левого операнда
полностью заканчивается;
первый операнд условного оператора, т. е. вычисление этого
операнда полностью завершается перед вычислением значе-
ний других операндов.
Часть I. Язык программирования С
58
Например, при вычислении значения следующего выражения вы-
зов функции
f
не происходит, т. к. левый операнд логического
оператора
&&
дает в результате
0
.
int x = 0, y;
y = x && f(x); /* y = 0 */
Однако в следующем случае функция
f
вызывается:
int x = 1, y;
y = x && f(x);
Г Л А В А
4
Управляющие инструкции
4.1. Инструкции выбора
if
и
if...else
Инструкция
if
имеет следующий синтаксис:
if (выражение)
инструкция
Работает
if
следующим образом. Сначала вычисляется логиче-
ское значение
выражения
. При этом отметим, что при вычислении
выражения
завершаются все побочные эффекты. Если это логиче-
ское значение истинно, то выполняется
инструкция
. В противном
случае
инструкция
пропускается. Например, в следующем приме-
ре значение
x
увеличивается на единицу только в том случае, ес-
ли выполняется условие
x > 0
:
if (x > 0)
++x;
Если в зависимости от логического значения
выражения
необхо-
дим выбор одной из двух инструкций, то используется инструк-
ция
if...else
, которая имеет следующий синтаксис:
if (условие)
инструкция_1
else
инструкция_2
Часть I. Язык программирования С
60
В этом случае, если логическое значение
выражения
истинно, то
выполняется
инструкция_1
, в противном случае выполняется
инструкция_2
. Например:
if (a > 0)
++a;
else
--a;
Отметим, что инструкции
if
и
if...else
могут быть вложенны-
ми. Например:
if (a > 0)
if (b > 0)
c = a + b;
else
c = a – b;
В этом примере ключевое слово
else
относится ко второй инст-
рукции
if
. Чтобы связать это слово с первой инструкцией
if
,
нужно заключить вторую инструкцию
if
в блок, т. е. написать:
if (a > 0)
{
if (b > 0)
c = a + b;
}
else
c = a – b;
4.2. Инструкция выбора
switch
Инструкция выбора
switch
имеет следующий вид:
switch (выражение)
{
case константа_1:
инструкции
case константа_2:
инструкции
...