В книге периодически встречаются загадочные, фактографически неверные заявления. Которые к тому же имеют последствия.
Цитата:
Напомню, что компилятор Microsoft Visual C++ требует, чтобы определения переменных помещались сразу за фигурной скобкой, открывающей тело функции, и перед любыми выполняемыми инструкциями.
"Классический" С и компилятор Microsoft вместе с ним требуют, чтобы объявления переменных помещались сразу за фигурной скобкой, открывающей
новый блок. Требования помещать их сразу за фигурной скобкой, открывающей именно
тело функции, нет и никогда не было. (Точнее такое требование существовало в "зачаточном" С в 1970х годах, но было упразднено уже в K&R).
Тем не менее по примерам в книге видно, что авторы не понимали этой разницы и усердно пихали объявления переменных в начало функций. Это выглядит криво и создает неправильные привычки у читателей.
Цитата:
Стандарт языка C позволяет помещать определения переменных в любом месте, непосредственно перед их использованием в коде. Некоторые компиляторы, такие как GNU gcc , поддерживают подобную возможность.
Книга была издана в 2014 году, когда компилятор С в составе Visual Studio уже поддерживал C99 почти полностью (пока как расширение языка). То есть и в Visual Studio у вас была возможность "помещать определения переменных в любом месте, непосредственно перед их использованием" в С коде.
---
Также постоянно встречается популярная терминологическая ошибка, когда все объявления функций называются "прототипами". В языке С
прототипом называется только такое объявление функции, в котором явно указаны количество и типы параметров. Остальные объявления называются "объявлениями без прототипа" или "old-style объявлениями".
В примере E.7 в книге написано такое:
Цитата:
Код:
returnImplicitInt(); /* прототип без типа возвращаемого значения */
int demoImplicitInt( x ); /* прототип без типа параметра */
В первом объявлении ошибка чисто терминологическая - это не прототип, это old-style объявление
без прототипа.
Во втором объявлении все совсем плохо: никогда в языке С правило "implicit int" не распространялось на списки параметров в объявлениях (не определениях) функций. Объявление такой функции может быть сделано либо в старом стиле - без прототипа
Код:
int demoImplicitInt();
либо в новом стиле - с прототипом
Код:
int demoImplicitInt(int x);
// или
int demoImplicitInt(int);
Вариант
Код:
int demoImplicitInt( x );
приведенный в книге, вообще не корректен. Он не является и не являлся корректным никогда и нигде.