¿Alguien sabe la razón por la que las variables deben definirse en la parte superior de la función?

Tengo una pregunta, ¿alguien sabe por qué las variables deben definirse? inicializado al comienzo de una función? ¿Por qué no puede inicializar o definir variables en medio de una función en C como en C ++?

preguntado el 27 de agosto de 11 a las 23:08

Incluso con compiladores anteriores a C99, no es necesario inicializar una variable local hasta que esté listo para inicializarla. -

Si su compilador de C no admite variables en medio de una función, no es compatible con C99 y es hora de actualizar a una que sí lo haga. -

Incluso en C preestándar, siempre puede definir variables al comienzo de cualquier bloque de instrucciones (por ejemplo, después de la { in if (expr) { ... }) dentro de una función. No podía introducir variables después de la primera no declaración o no definición hasta que C99 le concediera el mismo permiso que C ++ le había dado durante mucho tiempo (y tenía un compilador C99). -

Nota historica: La estructura de bloques y declaraciones en C fue heredada de Algol 60, que aparentemente inventó el principio de declaraciones al comienzo de un bloque. (Algol 58 parece haber permitido declaraciones en cualquier lugar del nivel superior de un organismo de procedimiento, pero en ninguna parte en bloques interiores). Escribir analizadores sintácticos todavía era una especie de arte negro alrededor de 1960, por lo que tener declaraciones en cualquier lugar podría haber sido un problema real en ese entonces. Cuando se inventó C a principios de la década de 1970, no habría sido una carga significativa para un compilador. pero para entonces ya había tradiciones a seguir. -

5 Respuestas

Esta es una tradición que proviene de los primeros compiladores de C, cuando el compilador necesita todas las definiciones de variables locales antes de que comience el código real de la función (para generar el cálculo del puntero de pila derecho). Esta era la única forma de declarar variables locales en el lenguaje C temprano, tanto preestándar (K&R) como el primer estándar C, C90, publicado en 1989-1990 (ANSI X3.159-1989, ISO / IEC 9899: 1990).

C99: la norma ISO de 1999 años (ISO / IEC 9899: 1999) de C permite declaraciones en el medio de la función.

C ++ permite esto porque es un lenguaje más nuevo que C. Los estándares de C ++ son ISO / IEC 14882: 1998 e ISO / IEC 14882: 2003, por lo que son de 1998 y 2003 años.

Puede inicializar la variable (darle un valor: a=4;) en el punto de definición o en cualquier momento posterior.

Respondido 28 ago 11, 03:08

Eso es un remanente de principios de C. C99 permite que las variables se definan en cualquier lugar de la función, incluso en las estructuras de bucle.

for (int i = 0; i < 10; ++i) { int j; }

El retroceso es de cuando los compiladores necesitaban saber el tamaño de la pila de la función antes de crear una instancia del código de la función. A medida que los compiladores mejoraron, el requisito se volvió molesto.

Respondido 28 ago 11, 03:08

Pero incluso las primeras C permitían declaraciones en bloques internos y también permitían goto declaraciones para saltar a esos bloques desde el exterior. Por lo tanto, un compilador de emitir código mientras analiza aún necesitaría actualizar el tamaño de la variable local en el prólogo de la función después de haber traducido el cuerpo de cada función. Más que las limitaciones del compilador en el principio de C, creo que la explicación debe ser que todo el mundo estaba acostumbrado a que las declaraciones fueran separadas, de modo que ni siquiera se les ocurrió a los diseñadores que permitirles mezclarse con el código sería útil. - hmakholm dejó a Monica

Puede hacer esto en C siempre que use un compilador C99. La restricción se levantó en C99.

Es de suponer que la restricción estaba originalmente allí porque los compiladores eran menos capaces, o quizás simplemente porque nadie pensó en permitir tal conveniencia para el programador.

Al responder una pregunta como esta, a veces vale la pena darle la vuelta. ¿Por qué los diseñadores originales de C lo habrían hecho al revés? ¡No tenían C ++ para guiarlos!

Respondido 28 ago 11, 04:08

Rechacé esto porque originalmente decía "simplemente ve y usa un compilador C99", lo que creía que no ayudaba en absoluto, ya que parecía ser una pregunta sobre "por qué", es decir, qué decisión / limitación de diseño estaba detrás de hacerlo. de esa manera. Lo ha mejorado mucho ahora, así que si modifica un poco su respuesta para que me permita eliminar mi voto negativo y @ yo, lo haré. - Seth Carnegie

@Seth Encontré la pregunta difícil de entender en su forma original debido a la barrera del idioma. - David Heffernan

En C ++ y C99, enlatado definir variables en medio de una función. Lo que no puedes hacer es remitir a una variable que aún no se ha definido.

Desde el punto de vista de la programación orientada a objetos, de otra manera no tendría mucho sentido: al definir una variable, le das vida a un objeto (llamando a su constructor). Antes de eso, hay is ningún objeto, por lo que no hay nada con qué interactuar hasta que pase el punto de construcción del objeto.

Respondido 28 ago 11, 03:08

Considere, sin embargo, ActionScript, un lenguaje basado en clases en el que las variables locales siempre están visibles y vivas en el toda función a la que pertenecen, incluso si su declaración está léxica en profundidad dentro de un bucle interno. (No iría tan lejos como para decir esto tiene sentido, así que tienes razón después de todo). - hmakholm dejó a Monica

Henning: Bueno, por supuesto, podría diseñar un lenguaje sin tales restricciones; el compilador o el tiempo de ejecución solo tendrían que mirar hacia adelante y averiguar dónde almacenar las cosas. Pero para un lenguaje que está muy cerca de la implementación, como C, hacer explícita la vida útil del objeto es una especie de elección de diseño natural que le da al programador control sobre lo que está sucediendo. Pero tiene razón, en general esto es solo una cuestión de cómo diseña el lenguaje y si puede compilar o ejecutar programas escritos en él. - Kerrek SB

Intente escribir un compilador con el poder primitivo de los viejos tiempos y se dará cuenta de que la flexibilidad es algo que preferiría matar para que el software funcione.

Poniendo las variables primero, luego otras declaraciones simplemente simplificaron el código del analizador / compilador.

Respondido 28 ago 11, 03:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.