C99: ¿Puedo declarar variables al comienzo de un bloque en un 'para'?
Pregunta
¿Es el siguiente código legal según C99?
...
for(....) {
int x = 4;
...
}
...
Puede suponer que antes de la línea 3, la variable x nunca fue declarada.
Hasta ahora solo he encontrado lo siguiente, pero no creo que esto sea suficiente:
Un bloque permite que un conjunto de declaraciones y declaraciones se agrupe en una unidad sintáctica. Se evalúan los inicializadores de objetos que tienen duración de almacenamiento automático, y los declarantes de matriz de longitud variable de los identificadores ordinarios con alcance del bloque, y los valores se almacenan en los objetos (incluido el almacenamiento de un valor indeterminado en objetos sin un inicializador) cada vez que la declaración es alcanzado en el orden de ejecución, como si fuera una declaración, y dentro de cada declaración en la orden de que aparecen los declarantes.
De la página 145 de ese PDF.
Solución
Sí, puede declarar o definir una variable en cualquier lugar que desee en C99 (al comienzo de un bloque en C89).
Usted dijo:
"Puede suponer que antes de la línea 3, la variable x nunca fue declarada".
Incluso si se declaró previamente, podría declarar un nuevo variable con el mismo nombre. Hacer eso evita que acceda a la antigua variable dentro de ese bloque.
int x = 0; /* old x */
printf("%d\n", x); /* old x, prints 0 */
do {
int x = 42; /* new x */
printf("%d\n", x); /* new x, prints 42 */
} while (0);
printf("%d\n", x); /* old x, prints 0 */
Nunca he probado lo siguiente en C99. Realmente no sé lo que pasa :)
Lo intentaré más tarde, cuando tenga acceso a un compilador (casi) C99
int x = 0;
do {
printf("%d\n", x); /* old x? new x? crash? Undefined Behaviour? */
int x = 42;
} while (0);
La característica C99 de declarar/definir variables donde sea que uno quiera no es una característica que me haga querer cambiar :)
Otros consejos
Esto es legal tanto en C99 como en C89. Mire 6.8.2, que define la declaración compuesta
Sí, puede crear una variable al comienzo de cualquier bloque. La variable se inicializa cada vez que se ingresa el bloque en C ++, puede crearlos en cualquier lugar dentro del bloque.
for(....)
{
int x=4;
/*More code*/
}
Sí, esto es legal en C99, pero no se le permite acceder a 'X' después del bloque. Sería un comportamiento indefinido tratando de acceder a 'X' más allá de su alcance.