|
Управление потоком
3 Управление потоком
Управляющие операторы языка определяют порядок вычислений. В приведенных ранее примерах мы уже встречались с наиболее употребительными управляющими конструкциями языка "C"; здесь мы опишем остальные операторы управления и уточним действия операторов, обсуждавшихся ранее.
3.1. Операторы и блоки
Такие выражения, как x=0, или i++, или printf(...), становятся операторами, если за ними следует точка с запятой, как, например,
x = 0; i++; printf(...);
В языке "C" точка с запятой является признаком конца оператора, а не разделителем операторов, как в языках типа алгола.
Фигурные скобки { и } используются для объединения описаний и операторов в составной оператор или блок, так что они оказываются синтаксически эквивалентны одному оператору. Один явный пример такого типа дают фигурные скобки, в которые заключаются операторы, составляющие функцию, другой - фигурные скобки вокруг группы операторов в конструкциях if, else, while и for (на самом деле переменные могут быть описаны внутри любого блока; мы поговорим об этом в "лекции 4" ). Точка с запятой никогда не ставится после первой фигурной скобки, которая завершает блок.
3.2. IF - ELSE
Оператор if - else используется при необходимости сделать выбор. Формально синтаксис имеет вид
if (выражение) оператор-1 else оператор-2,
Где часть else является необязательной. Сначала вычисляется выражение; если оно "истинно" /т.е. значение выражения отлично от нуля/, то выполняется оператор-1. Если оно ложно /значение выражения равно нулю/, и если есть часть с else, то вместо оператора-1 выполняется оператор-2.
Так как if просто проверяет численное значение выражения, то возможно некоторое сокращение записи. Самой очевидной возможностью является запись
if (выражение)
вместо
if (выражение !=0)
иногда такая запись является ясной и естественной, но временами она становится загадочной.
То, что часть else в конструкции if - else является необязательной, приводит к двусмысленности в случае, когда else опускается во вложенной последовательности операторов if. Эта неоднозначность разрешается обычным образом - else связывается с ближайшим предыдущим if, не содержащим else.
Например, в
if ( n > 0 ) if( a > b ) z = a; else z = b;
конструкция else относится к внутреннему if, как мы и показали, сдвинув else под соответствующий if. Если это не то, что вы хотите, то для получения нужного соответствия необходимо использовать фигурные скобки:
if (n > 0) { if (a > b) z = a; } else z = b;
Tакая двусмысленность особенно пагубна в ситуациях типа
if (n > 0) for (i = 0; i < n; i++) if (s[i] > 0) { printf("..."); return(i); } else /* wrong */ printf("error - n is zero\n");
Запись else под if ясно показывает, чего вы хотите, но компилятор не получит соответствующего указания и свяжет else с внутренним if. Ошибки такого рода очень трудно обнаруживаются.
Между прочим, обратите внимание, что в
if (a > b) z = a; else z = b;
после z=a стоит точка с запятой. Дело в том, что согласно грамматическим правилам за if должен следовать оператор, а выражение типа z=a, являющееся оператором, всегда заканчивается точкой с запятой.