Rambler's Top100 Service калинин.ru / программирование / c и c++ /  << 17.07.00 >>

Правило "право-лево"

Автор

Этот текст не мой. Авторство принадлежит Alexander V. Naumochkin (к сожалению, знаю только адрес в сети FIDO, 2:5020/59), на мой взгляд, один из самых грамотных C++ программистов, которых я когда-нибудь (лично или "виртуально") встречал. Тем не менее, считаю просто-таки своим долгом выложить этот текст здесь, потому что он отличается очень большой полезностью, а в FAQ конференции SU.C_CPP до сих пор не включен. Кроме того, я его больше нигде и не встречал, так что пусть здесь полежит. Надеюсь, Александр не обидится.

А как вообще фоpмулиpуется основной пpинцип pазбоpа сложных синтаксических констpукций языка, навpоде "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int"?

Давно и чётко формализовано в виде правила "право-лево". Всё предельно просто. Имеем:

  • () - функция, возвращающая...
  • [] - массив из...
  • * - указатель на...

Процесс разбора итеративный:

  1. Первым делом находим имя, от которого и будем плясать. Пляски начинаются со слов "Имя есть..."
  2. Следующий шаг - шаг вправо. Что там у нас справа? Если (), то говорим, что "Имя есть функция, возвращающая...". (если промеж скобок что-то есть, то "Имя есть функция, принимающая то, что между скобок, и возвращающая...") Если там [], то "Имя есть массив из..." И таким вот образом мы идём вправо до тех пор, пока не дойдём до конца объявления или правой ) скобки. Тут тормозим...
  3. ...и начинаем танцевать влево. Что у нас слева? Если это что-то не из приведённой выше таблицы (то есть не (), [], *), то просто добавляем к уже имеющейся расшифровке. Если же там что-то из этих трёх символов, то добавляем то, что написано в таблице. И так танцуем до тех пор, пока не дотанцуем до конца (точнее - начала объявления) или левой ( скобки. Если дошли до начала, то всё готово. А если дошли до (, то по уже означенной итеративности переходим к шагу 2 - пляски вправо продолжаем.

Пример:

        int (*(*(*fptr)())[3])();
                  ^^^^
    
  1. Hаходим имя и записываем "fptr есть..."
  2. Шаг вправо, но там ), потому идём влево
            int (*(*(*fun)())[3])();
                     ^
    	
    и получаем "fptr есть указатель на..."
  3. Продолжаем ехать влево, но тут (. Идём вправо
            int (*(*(*fun)())[3])();
                          ^^
    	
    получаем "fptr есть указатель на функцию, возвращающую..." Снова ), опять влево.
  4. Получаем
            int (*(*(*fun)())[3])();
                   ^
    	
    "fptr есть указатель на функцию, возвращающую указатель на..." Слева опять (, идём вправо.
  5. Получаем
            int (*(*(*fun)())[3])();
                             ^^^
    	
    "fptr есть указатель на функцию, возвращающую указатель на массив из трёх..." И снова справа ), отправляемся влево
  6. Получаем
            int (*(*(*fun)())[3])();
                 ^
    	
    "fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на..." Снова разворот вправо по причине (
  7. Получаем
            int (*(*(*fun)())[3])();
                                 ^^
    	
    "fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на функции, возвращающие..." Тут конец описания, поехали влево и получили окончательную расшифровку этой каракули
  8.         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)
   Что такое мюзикл и чем он отличается от оперы, балета или театральной постановки? Наверняка, на это есть ответ, который записан в...   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
Простой, но полезный аллокатор памяти (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-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100