Esta pregunta sigue a this other question about C declarations. Leyendo la respuesta a esta pregunta, leí sobre el spiral rule y también entendí lo que significa "declaración después del uso".Regla espiral y 'declaración sigue al uso' para analizar las declaraciones C y C++
Ok hasta ahora. Pero luego leí this declaration:
char *(*(*a[N])())();
y me preguntaba cómo analizar con la "declaración sigue el uso" 'regla'. Especialmente para la parte de la matriz.
Lo que leo es:
(*(*a[N])())
es una función ()
devolviendo un char *
, a continuación, eliminación de referencias a la siguiente
(*a[N])() // 1
es esta 'función que devuelve un char*
', y así 1 es una 'puntero a una función que devuelve char *
' entonces yo diría 'cuando se llama (*a[N])
, es [declaración anterior]'. En este punto tenemos (*a[N])
es una función que devuelve un puntero a una función que devuelve char *
.
Pero entonces no sé cómo aplicar esta regla para distinguir entre el 'puntero al array' y 'conjunto de puntero'.
¿Alguien puede aclarar esto?
Otra pregunta: ¿cuáles son las reglas de "precedencia" en tales declaraciones, entre &
(en C++), *
y []
? [Tal vez "prioridad" no es el término correcto]
Para comprobar si entendía la 'regla de caracol' correctamente, también analizar esta expresión más adelante; por favor dime si estoy equivocado.
+-----------+
| +------+ |
| | +-+ | |
| |^| | |
char* (*(* a[N])())();
^^^^^^
| | | | | |
| | +---+ | |
| +--------+ |
+--------------+
para mí es más fácil (por bucle circular):
a
es una matriz de N ...- puntero a una función que devuelve ...
- puntero a una función que devuelve ...
char *
Pero quizás me esté perdiendo algo que en ese caso me permite obtener la respuesta correcta, pero eso podría estar mal en otro caso más complicado.
@Vality: si va a soltar la etiqueta C++, debe omitir la mención de '&' en C++ también. –
@JonathanLeffler Buen punto, normalmente diría que esto se debe dividir en dos preguntas, pero es una pregunta tan vieja que soy reacio a hacerlo. – Vality
@Vality ¿Cómo es que la pregunta de repente llamó tanto la atención? (Me avisaron de la insignia de "buena pregunta"). –