Правило "право-лево"
Автор
Этот текст не мой. Авторство принадлежит Alexander V. Naumochkin (к сожалению,
знаю только адрес в сети FIDO, 2:5020/59), на мой взгляд,
один из самых грамотных C++ программистов, которых я когда-нибудь (лично или "виртуально")
встречал. Тем не менее, считаю просто-таки своим долгом выложить
этот текст здесь, потому что он отличается очень большой полезностью,
а в FAQ конференции SU.C_CPP до сих пор не включен. Кроме того, я его больше
нигде и не встречал, так что пусть здесь полежит. Надеюсь, Александр не обидится.
|
А как вообще фоpмулиpуется основной пpинцип pазбоpа сложных
синтаксических
констpукций языка, навpоде "указатель на функцию, возвpащающую указатель
на массив из тpёх указателей на функции, возвpащающие значение int"?
Давно и чётко формализовано в виде правила "право-лево". Всё предельно просто.
Имеем:
-
() - функция, возвращающая...
-
[] - массив из...
-
* - указатель на...
Процесс разбора итеративный:
- Первым делом находим имя, от которого и будем плясать. Пляски начинаются
со слов "Имя есть..."
- Следующий шаг - шаг вправо. Что там у нас справа? Если
(), то говорим,
что "Имя есть функция, возвращающая...". (если промеж скобок что-то есть,
то "Имя есть функция, принимающая то, что между скобок, и возвращающая...")
Если там [], то "Имя есть массив из..." И таким вот образом мы идём
вправо до тех пор, пока не дойдём до конца объявления или правой ) скобки.
Тут тормозим...
- ...и начинаем танцевать влево. Что у нас слева? Если это что-то не из
приведённой выше таблицы (то есть не
(), [], *), то просто добавляем к
уже имеющейся расшифровке. Если же там что-то из этих трёх символов, то
добавляем то, что написано в таблице. И так танцуем до тех пор, пока не
дотанцуем до конца (точнее - начала объявления) или левой ( скобки.
Если дошли до начала, то всё готово. А если дошли до (, то по уже
означенной итеративности переходим к шагу 2 - пляски вправо продолжаем.
Пример:
int (*(*(*fptr)())[3])();
^^^^
- Hаходим имя и записываем "fptr есть..."
- Шаг вправо, но там
), потому идём влево
int (*(*(*fun)())[3])();
^
и получаем "fptr есть указатель на..."
- Продолжаем ехать влево, но тут
(. Идём вправо
int (*(*(*fun)())[3])();
^^
получаем "fptr есть указатель на функцию, возвращающую..." Снова ),
опять влево.
- Получаем
int (*(*(*fun)())[3])();
^
"fptr есть указатель на функцию, возвращающую указатель на..." Слева
опять (, идём вправо.
- Получаем
int (*(*(*fun)())[3])();
^^^
"fptr есть указатель на функцию, возвращающую указатель на массив из
трёх..." И снова справа ), отправляемся влево
- Получаем
int (*(*(*fun)())[3])();
^
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх
указателей на..." Снова разворот вправо по причине (
- Получаем
int (*(*(*fun)())[3])();
^^
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх
указателей на функции, возвращающие..." Тут конец описания, поехали
влево и получили окончательную расшифровку этой каракули
-
int (*(*(*fun)())[3])();
^^^
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх
указателей на функции, возвращающие int"
Именно то, чего ты и хотел. Просто?
Версия для печати
| | Рядом в разделе: |
 |
| Новый язык программирования от Microsoft: C# (23.07.00) |
| |
Честно говоря, когда я первый раз об этом услышал, я подумал что это чья-то дурацкая шутка. Но нет, действительно, фирма Microsoft... >>>>
|
| STLport 4.0 (20.07.00) |
| |
14 июля 2000 года наконец-то вышла новая версия библиотеки 4.0. Для тех, кто еще не в курсе, что это такое, объясняю:... >>>>
|
|
 |
| | Рядом по дате: |
 |
| www.gnu.org, Free Software Foundation (18.07.00) |
| |
Собственно, у меня был достаточно большой выбор, каким сайтом начать этот раздел. Самый выигрышный вариант --- взять какую-нибудь чужую страницу, быстро... >>>>
|
| Кошки / Cats, 1981 (17.07.00) |
| |
Что такое мюзикл и чем он отличается от оперы, балета или театральной постановки? Наверняка, на это есть ответ, который записан в... >>>>
|
|
| | Содержание: |
 |
|
|
| | В этом разделе: |
 |
| Простой, но полезный аллокатор памяти (18.02.03) |
| |
Эта заметка --- продолжение "Postfix изнутри" в том смысле, что в качестве примера опять берется postfix. Но если в прошлый раз... >>>>
|
| C или C++? (09.07.01) |
| |
Существуют два диаметрально противоположенных, но одинаково распространенных мнения, которые можно выразить как "C++ это C с классами" и "C++ и C... >>>>
|
| Религия и goto (14.04.01) |
| |
Начнем несколько издалека. В программировании существует тенденция к алгоритмизации самого процесса программирования. То есть, выведение некоторых универсальных правил, использование которых в... >>>>
|
| ploticus (16.10.00) |
| |
Есть такая программа, предназначенная для создания графиков различных видов из командной строки, называется ploticus. Программа сама по себе достаточно удобная ---... >>>>
|
| Шаманство, или ошибки работы с памятью (25.09.00) |
| |
Когда программа становится внушительной по своему содержанию (то есть, не по количеству строчек, а по непонятности внутренних связей), то ее поведение... >>>>
|
| Библиотека консорциума W3, libwww (20.09.00) |
| |
Популярный нынче термин "веб-программирование" обычно подразумевает под собой программирование, в лучшем случае, на perl, в худшем --- на PHP, в совсем... >>>>
|
| Инварианты внутри программы (18.09.00) |
| |
Вы когда-нибудь задумывались, над тем, как вы пишите программы? Если нет, то, я думаю, сегодняшняя заметка будет вам полезна. Итак, как... >>>>
|
| Содержание раздела полностью... |
| |
Примерно в тоже время |
 |
| www.gnu.org, Free Software Foundation (18.07.00) |
| |
Собственно, у меня был достаточно большой выбор, каким сайтом начать этот раздел. Самый выигрышный вариант --- взять какую-нибудь чужую страницу, быстро... >>>>
|
| Кошки / Cats, 1981 (17.07.00) |
| |
Что такое мюзикл и чем он отличается от оперы, балета или театральной постановки? Наверняка, на это есть ответ, который записан в... >>>>
|
| Хронология полностью... |
| |
Содержание |
 |
| Заглавная страница |
| Мой блог |
| Мое резюме |
| Дайджест |
| Программирование |
| |
C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
|
| TeX |
| Туризм |
| |
Байки
Фотографии
|
| Комментарии |
| |
Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
|
| Студенческое |
| Просто так |
| Благодарности |
| Форум |
| Хронология |
|