"Андрей Богатырев. Хрестоматия по программированию на Си в Unix" - читать интересную книгу автора


{ ..... Label: } а только { ..... Label: ; }

1.52. В каком случае оправдано использование оператора goto?
Ответ: при выходе из вложенных циклов, т.к. оператор break позволяет выйти
только из самого внутреннего цикла (на один уровень).

1.53. К какому if-у относится else?

if(...) ... if(...) ... else ...

Ответ: ко второму (к ближайшему предшествующему, для которого нет другого else).
Вообще же лучше явно расставлять скобки (для ясности):

if(...){ ... if(...) ... else ... }
if(...){ ... if(...) ... } else ...

1.54. Макроопределение, чье тело представляет собой последовательность операторов в
{...} скобках (блок), может вызвать проблемы при использовании его в условном опера-
торе if с else-частью:

#define MACRO { x=1; y=2; }

if(z) MACRO;
else .......;

Мы получим после макрорасширения

if(z) { x=1; y=2; } /* конец if-а */ ;
else .......; /* else ни к чему не относится */

то есть синтаксически ошибочный фрагмент, так как должно быть либо

if(...) один_оператор;
else .....
либо
if(...){ последовательность; ...; операторов; }
else .....

где точка-с-запятой после } не нужна. С этим явлением борются, оформляя блок {...} в
виде do{...}while(0)

#define MACRO do{ x=1; y=2; }while(0)

Тело такого "цикла" выполняется единственный раз, при этом мы получаем правильный
текст:

А. Богатырев, 1992-95 - 25 - Си в UNIX

if(z) do{ x=1; y=2; }while(0);