2010-09-14 16 views
17

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.

+0

@Vality: si va a soltar la etiqueta C++, debe omitir la mención de '&' en C++ también. –

+0

@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

+0

@Vality ¿Cómo es que la pregunta de repente llamó tanto la atención? (Me avisaron de la insignia de "buena pregunta"). –

Respuesta

12

Solo tienes que crearlo en pasos.

char *X(); // X =~ (*(*a[N])()) 

Función regresar char*

char *(*Y())(); // Y =~ (*a[N]) 

función de puntero regrese a su función de regresar char*.

En una declaración, al igual que en una expresión (declaración uso de seguimiento), postfix [] tiene una prioridad más alta que unario * por lo *a[N] es equivalente a *(a[N]), no (*a)[N].

char *(*(*Z)())(); // Z =~ a[N] 

puntero a puntero devolver la función a función que devuelve char*.

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

arreglo de n punteros a funciones devolviendo un puntero a función que devuelve char*.

Cuestiones relacionadas