Второе новшество, которое наиболее четко отличает C от его
предшественники это более полная структура типа и особенно его
Выражение в синтаксисе объявлений ... дан объект любого
типа, должно быть возможно описать новый объект, который собирается
несколько в массив, возвращает его из функции или является указателем на
это .... [Это] привело к
синтаксис объявления для имен, отражающих синтаксис выражения
в котором имена обычно появляются. Таким образом,
int i, *pi, **ppi;
объявить целое число, указатель на целое число,
указатель на указатель на целое число. Синтаксис этих объявлений
отражает наблюдение, что i, *pi, and **ppi
все дают тип int
когда используется в выражении.
Аналогично, int f(), *f(), (*f)();
объявляем
функция, возвращающая целое число, функция, возвращающая указатель на
целое число, указатель на функцию, возвращающую целое число. int *api[10],
(*pai)[10];
объявляет массив указателей на целые числа и указатель на
массив целых чисел.
Во всех этих случаях декларация
переменная напоминает ее использование в выражении, тип которого
назван во главе декларации .
Случайность синтаксиса способствовала воспринимаемой сложности
язык. Оператор косвенного обращения, записанный * в C, является синтаксически
унарный префиксный оператор, как в BCPL и B. Это хорошо работает в
простые выражения, но в более сложных случаях круглые скобки
требуется направить разбор. Например, чтобы отличить
перенаправление через значение, возвращаемое функцией от вызова
функция, обозначенная указателем, пишет *fp() and (*pf)()
соответственно. Стиль, используемый в выражениях, распространяется на
объявления, поэтому имена могут быть объявлены
int *fp(); int (*pf)();
В более изящных, но все же реалистичных случаях,
все становится хуже: int *(*pfp)();
- указатель на функцию
возврат указателя на целое число.
Происходит два эффекта.
Что наиболее важно, C имеет относительно богатый набор способов описания
типы (по сравнению, скажем, с Паскалем). Объявления на языках как
выразить как C - Алгол 68, например - описать объекты, одинаково трудно
понять, просто потому что сами объекты сложны.
Второй эффект обязан деталям синтаксиса. Объявления в C должны быть
читать в стиле «наизнанку», который многим трудно понять.
Сетхи [Сетхи 81] заметил, что многие из вложенных
объявления и выражения стали бы проще, если бы косвенность
оператор был принят в качестве постфиксного оператора вместо префикса, но
к тому времени было уже слишком поздно что-либо менять.