Опубликован: 05.07.2006 | Доступ: свободный | Студентов: 4680 / 885 | Оценка: 4.12 / 3.74 | Длительность: 18:59:00
Лекция 4:

Управление потоком

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Аннотация: Изучаются средства управления процессом обработки данных.

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, являющееся оператором, всегда заканчивается точкой с запятой.

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >