used - static variable en c
¿Dónde puedo declarar legalmente una variable en C99? (3)
En C99, puede declarar sus variables donde las necesite, al igual que C ++ le permite hacer eso.
void somefunc(char *arg)
{
char *ptr = "xyz";
if (strcmp(arg, ptr) == 0)
{
int abc = 0; /* Always could declare variables at a block start */
somefunc(arg, &ptr, &abc);
int def = another_func(abc, arg); /* New in C99 */
...other code using def, presumably...
}
}
Puede declarar una variable en la parte de control de un bucle ''for'':
for (int x = 0; x < 10; x++) /* New in C99 */
No puede declarar una variable en la parte de control de un ciclo ''while'' o una instrucción ''if''.
- No puede declarar una variable en una llamada a función.
- Obviamente, puede (y siempre podría) declarar variables en el bloque después de cualquier bucle o una instrucción ''if''.
El estándar C99 dice:
6.8.5.3 El enunciado for
La declaración
for ( clause-1 ; expression-2 ; expression-3 ) statement
se comporta de la siguiente manera: La expresión expresión-2 es la expresión de control que se evalúa antes de cada ejecución del cuerpo del bucle. La expresión expresión-3 se evalúa como una expresión vacía después de cada ejecución del cuerpo del bucle. Si la cláusula-1 es una declaración, el alcance de cualquier variable que declare es el resto de la declaración y todo el ciclo, incluidas las otras dos expresiones; se alcanza en el orden de ejecución antes de la primera evaluación de la expresión de control. Si la cláusula-1 es una expresión, se evalúa como una expresión vacía antes de la primera evaluación de la expresión de control.
Cuando me presentaron por primera vez a CI, le dijeron que siempre declarara mis variables en la parte superior de la función. Ahora que tengo una buena comprensión del idioma, estoy centrando mis esfuerzos en el estilo de codificación, particularmente, limitando el alcance de mis variables. He leído sobre los beneficios de limitar el alcance y encontré un ejemplo interesante. Aparentemente, C99 te permite hacer esto ...
for (int i = 0; i < 10; i++)
{
puts("hello");
}
Pensé que el alcance de las variables estaba limitado por las llaves { }
llaves { }
circundantes más internas { }
, pero en el ejemplo anterior, int i
parece tener un alcance limitado por las llaves del bucle for aunque se declare fuera de ellas .
Traté de extender el ejemplo anterior con fgets()
para hacer lo que pensé que era algo similar, pero ambos me dieron un error de sintaxis.
fgets(char fpath[80], 80, stdin);
*Ver nota**
fgets(char* fpath = malloc(80), 80, stdin);
Entonces, ¿dónde exactamente es legal declarar variables en C99? ¿Fue el ejemplo de for-loop una excepción a la regla? ¿Esto se aplica a while
y do while
loops también?
* Nota **: Ni siquiera estoy seguro de que esto sea sintácticamente correcto incluso si pudiera declarar la matriz de caracteres allí ya que fgets()
está buscando un puntero a char, no apuntando a la matriz 80 de char . Es por eso que probé la versión malloc()
.
La conclusión con respecto a su confusión for
/ fgets
es que mientras que "delimitar el alcance de control de llaves" es la regla correcta en C la mayor parte del tiempo, hay otra regla sobre el alcance en C99 (tomada de C ++) que dice que una variable declarada en el prólogo de una estructura de control (es decir, for
, while
, if
) está en el alcance en el cuerpo de la estructura (y no está dentro del alcance fuera del cuerpo).
Lo primero que señalaría es que no debes confundir
for (int i = 0; i < 10; i++) {
puts("hello");
}
y
fgets(char* fpath = malloc(80), 80, stdin);
El primero es una estructura de control, mientras que el segundo es una llamada de función. La estructura de control evalúa el texto dentro de sus parens () de una manera muy diferente de cómo lo hace una llamada a función.
La segunda cosa es ... No entiendo lo que intentas decir con:
el compilador le dará un error prontamente si trata de usar i dentro del cuerpo for-loop.
El código que listó para el bucle for es una estructura muy común en C y la variable "i" debería estar disponible dentro del cuerpo del bucle for. Es decir, lo siguiente debería funcionar:
int n = 0;
for (int i = 0; i < 10; i++) {
n += i;
}
¿Estoy malinterpretando lo que estás diciendo?