Правило спирали и «объявление следует за использованием» для синтаксического анализа объявлений C и C ++

Этот вопрос следует за другим вопросом о декларациях C . Читая ответ на этот вопрос, Я читал о правиле спирали , и я также понял, что означает «объявление следует за использованием».

Хорошо, пока. Но затем я прочитал это объявление :

char *(*(*a[N])())(); 

и мне было интересно, как его разобрать с помощью «правила» «объявление следует за использованием». Специально для части массива.

Я прочитал следующее:

(*(*a[N])()) 

- это функция () , возвращающая char * , то разыменование следующего

(*a[N])() // 1

будет следующим: функция, возвращающая char * ', поэтому 1 -' указатель на функцию, возвращающую char * ' тогда я бы сказал: «когда вызывается (* a [N]) , это [предыдущее объявление]». На данный момент у нас есть (* a [N]) - это функция, возвращающая указатель на функцию, возвращающую char * .

Но тогда я не знаю, как применить это правило, чтобы различать «указатель на массив» и «массив указателя».

Может кто-нибудь прояснить это?

Другой вопрос: каковы правила «приоритета» в таких объявлениях между и (в C ++), * и [] ]? [возможно, «приоритет» - неправильный термин]


Чтобы проверить, правильно ли я понял «правило спирали», я также разбираю это выражение ниже; скажите, пожалуйста, если я ошибаюсь.

       +-----------+
       | +------+  |
       | | +-+  |  |
       | | ^ |  |  |
char* (*(* a[N])())(); 
    ^  ^ ^   ^  ^  ^
    |  | |   |  |  |
    |  | +---+  |  |
    |  +--------+  |
    +--------------+

Для меня это проще (цикл за циклом):

  • a - это массив из N ...
  • указатель на функцию, возвращающую ...
  • указатель на возвращающую функцию ...
  • char *

Но я, возможно, что-то упустил, что в этом случае позволило мне получить правильный ответ, но это могло быть неправильно в еще один более сложный случай.

17
задан Community 23 May 2017 в 12:01
поделиться