Точки следования позволяют прояснить, когда происходит постфиксное инкрементирование. Рассмотрим в качестве примера следующий код:
while (guests++ < 10)
printf("%d \n", guests);
Иногда начинающие программисты на С полагают, что фраза “использовать значение и затем инкрементировать его” означает в данном контексте увеличение значения переменной guests после ее использования в операторе printf(). Однако guests++< 10 — это полное выражение, поскольку оно представляет собой условие проверки цикла while и, следовательно, конец этого выражения является точкой следования. Таким образом, язык С гарантирует, что побочный эффект (инкрементирование guests) произойдет до того, как программа перейдет к выполнению printf(). Тем не менее, применение постфиксной формы гарантирует то, что переменная guests будет инкрементирована после ее сравнения со значением 10.
Теперь рассмотрим следующий оператор:
у = (4 + х++) + (6 + х++);
Выражение 4 + х++не является полным выражением, поэтому С не гарантирует, что значение х будет инкрементировано сразу после вычисления подвыражения 4 + х+ + . Здесь полное выражение представлено целым оператором присваивания, и точка с запятой отмечает точку следования. Таким образом, С может гарантировать только то, что к момен ту перехода программы к выполнению следующего оператора значение х будет инкрементировано два раза. При этом в языке С не уточняется, будет ли значение х инкрементировано после вычисления каждого подвыражения или после вычисления всех выражений, что и является причиной, по которой следует избегать операторов подобного рода.
Составные операторы (блоки)
Составной оператор — это два или большее количество операторов, сгруппированных вместе путем помещения их в фигурные скобки; его также называют блоком. В программе shoes2 .с блок используется для того, чтобы позволить оператору while содержать более одного оператора. Сравните следующие фрагменты кода:
/* фрагмент 1 */
index = 0;
Операции, выражения и операторы 183
while (index++ < 10)
sam = 10 * index + 2;
printf("sam= %d\n", sam);
/* фрагмент 2 */ index = 0;
while (index++ < 10)
{
sam = 10 * index + 2; printf("sam = %d\n", sam);
}
Внутри фрагмента 1 в цикл while включен только оператор присваивания. В отсутствие фигурных скобок область действия оператора while распространяется от ключевого слова while до следующей точки с запятой. Функция printf() вызывается только один раз — по завершении цикла.
Во фрагменте 2 наличие фигурных скобок гарантирует, что оба оператора являются частью цикла while, а функция printf() вызывается при каждом выполнении цикла. В терминах структуры оператора while весь составной оператор рассматривается как единственный оператор (рис. 5.7).

Рис. 5.7. Цикл while с составным оператором
СОВЕТ. Советы касательно стиля
Еще раз взгляните на оба фрагмента кода с операторами while и обратите внимание на пометку тела цикла с помощью отступов. Для компилятора отступы не имеют никакого значения. При интерпретации ваших инструкций он применяет фигурные скобки и свое знание структуры циклов while. Здесь отступы служат для того, чтобы облегчить зрительное восприятие организации программы.
Приведенный выше пример демонстрирует широко распространенный способ расстановки фигурных скобок в случае применения блока операторов, или составного оператора. Другой не менее распространенный способ выглядит следующим образом:
while (index++ < 10) { sam = 10*index + 2; printf ("sam = %d \n", sam) ;
}
184 Глава 5
Этот стиль подчеркивает принадлежность блока к циклу while. В предыдущем стиле внимание акцентируется на том, что несколько операторов образуют блок. Повторимся еще раз: с точки зрения компилятора обе формы идентичны.
Подводя итоги, отметим: используйте отступы как инструмент, позволяющий сделать структуру программы более понятной для читателя.
Сводка: выражения и операторы Выражения
Выражение представляет собой комбинацию операций и операндов. Простейшим выражением является константа или переменная без операции, например, 2 2 или beebop. Более сложные выражения выглядят подобно 55 + 22nvap = 2 * (vip + (vup = 4)).
Операторы
Оператор — это инструкция компьютеру. Операторы бывают простыми и составными. Простые операторы завершаются точкой с запятой, как показано в следующих примерах.
int toes; toes = 12;
printf("%d\n", toes); while (toes < 20) toes = toes + 2; return 0;
Читать дальше