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

return(0);
}

1.43. А вот "шальной" комментарий.

void main(){
int n = 10;
int *ptr = &n;
int x, y = 40;

x = y/*ptr /* должно быть 4 */ + 1;
printf( "%d\n", x ); /* пять */
exit(0);
}

/* или такой пример из жизни - взят из переписки в Relcom */
...
cost = nRecords/*pFactor /* divided by Factor, and */
+ fixMargin; /* plus the precalculated */
...

Результат непредсказуем. Дело в том, что y/*ptr превратилось в начало комментария!
Поэтому бинарные операции принято окружать пробелами.

x = y / *ptr /* должно быть 4 */ + 1;

1.44. Найдите ошибки в директивах препроцессора Си [*] (вертикальная черта обозначает
левый край файла).

____________________
[*] Препроцессор Си - это программа /lib/cpp

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

|
| #include
|#include < sys/types.h >
|# define inc (x) ((x) + 1)
|#define N 12;
|#define X -2
|
|... printf( "n=%d\n", N );
|... p = 4-X;

Ответ: в первой директиве стоит пробел перед #. Диез должен находиться в первой
позиции строки. Во второй директиве в <<>> находятся лишние пробелы, не относящиеся к
имени файла - препроцессор не найдет такого файла! В данном случае "красота" пошла
во вред делу. В третьей - между именем макро inc и его аргументом в круглых скобках
(x) стоит пробел, который изменяет весь смысл макроопределения: вместо макроса с
параметром inc(x) мы получаем, что слово inc будет заменяться на (x)((x)+1). Заметим