Разбираемся в сложных объявлениях Си
15К открытий15К показов
Рассказывает Брайан Барто
Выше вы можете увидеть список объявлений на языке Си. Совсем недавно я не мог сказать, что они означают. Теперь же я могу вполне уверенно объяснить их, изучив правила приоритетов для объявлений в Си.
В моём случае изучение сложных объявлений было важным шагом к использованию сложных структур данных и расширению своих возможностей. Если я не могу прочитать сложное объявление, я не смогу его использовать, а следовательно, мне придётся использовать худшие решения.
Я думал, что для усвоения этой темы мне придётся действовать по стандартной схеме “повторение — мать учения”, но всё оказалось на удивление просто. Нужно запомнить лишь несколько правил — вот они, в порядке уменьшения приоритета:
- Скобки, объединяющие части объявления.
- Постфиксные операторы: круглые скобки
()
, обозначающие функцию, и квадратные[]
, обозначающие массив. - Префиксный оператор: звёздочка
*
, обозначающая указатель.
Начнём с четвертого объявления из моего списка.
Правила приоритетов говорят, что квадратные скобки старше указателя, поэтому foo — это массив указателей на символ, а не указатель на массив символов.
Вот пошаговый процесс применения правил к этому выражению. Начнём с имени foo: “foo — это…”. Дальше идут квадратные скобки: “foo — это массив из пяти…”. Осталась звёздочка: “foo — это массив из пяти указателей на…”. Добавляем тип и получаем: “foo — это массив из пяти указателей на символ”.
Если бы я хотел получить указатель на массив, то я должен был бы добавить круглые скобки:
В этот раз круглые скобки повысили приоритет звёздочки, и мы получили указатель на массив.
В восьмом объявлении присутствует две пары круглых скобок:
Я немного сократил количество шагов, но так, на мой взгляд, даже проще. К параметрам функций правила применяются аналогично.
И последний пример — самое сложное объявление из списка:
Стоит заметить, что последний пример является крайним случаем использования правил приоритетов, и на практике такое не приветствуется. Кроме того, обратите внимание, что в рассмотренных примерах не используются ключевые слова наподобие const
и volatile
, а также нет объявлений структур, перечислений и объединений.
15К открытий15К показов