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.

C99 (PDF)

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top