Discussion:
Declaración dentro de un switch - case
(demasiado antiguo para responder)
Pedro
2005-04-13 14:44:19 UTC
Permalink
Hola,
me acaba de surgir una duda que nunca me había planteado. A lo mejor
es un poco absurda, pero ahí va:
¿por qué no se puede hacer esto?

switch(variable)
{
case 1:
int x = 0;
......
break;
default:
break;
}


Da un error de inicialización de la variable x. ¿por qué se puede
declarar pero no inicializar?

Muchas gracias.

Pedro
Sergio
2005-04-13 15:52:33 UTC
Permalink
Post by Pedro
Hola,
me acaba de surgir una duda que nunca me había planteado. A lo mejor
¿por qué no se puede hacer esto?
switch(variable)
{
int x = 0;
......
break;
break;
}
Da un error de inicialización de la variable x. ¿por qué se puede
declarar pero no inicializar?
Muchas gracias.
Pedro
haz esto:

switch (variable)
{
case 1:
{ //<-Abre la llave
int x = 0;
....
} //<-Cierra la llave
break;
default:
break;
}

No te dará ningún problema (al menos no debería)
Rodrigo Corral [MVP]
2005-04-13 21:11:45 UTC
Permalink
Supón este caso:

switch (var)

{

case 1:

int x = 0;

break;

default:

cout << x;


break;

}

El ambito de x es el del switch se supone, siguiendo la regla general de que
las llaves delimitan el ambito de las variables, luego ese codigo seria
legal, pero puede ocurrir que entres en default y por tanto la variable no
se inicialice. En el caso de int esto no es muy catastrofico pero si se
trata de un puntero el casque es inevitable. Para evitar ese problema es por
lo que ese código no es legal.

La solucion que plantea el post anterior es valida pero no exacta del todo
ya que el ambito de la variable se reduce, no es todo el switch, es decir
solo puedes usar la variable dentro de uno de los case.
--
Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
El Mago de Oz
2005-04-18 22:19:36 UTC
Permalink
Hola, soy el que empezó este hilo; pero ahora escribo desde casa, porque en
el curro no se actualizan las news a traves de Google, que es donde la veía.

Entiendo lo que me dices, pero si eso es así, ¿porque esto otro compila
perfectamente?

switch (var)
{
case 1:
int x;
x = 0;
break;

default:
break;
}

En realidad es el mismo caso, ¿no? lo único es que en este ejemplo se da
valor a x en la linea siguiente a su declaración. ¿me equivoco?
Post by Rodrigo Corral [MVP]
switch (var)
{
int x = 0;
break;
cout << x;
break;
}
El ambito de x es el del switch se supone, siguiendo la regla general de
que las llaves delimitan el ambito de las variables, luego ese codigo
seria legal, pero puede ocurrir que entres en default y por tanto la
variable no se inicialice. En el caso de int esto no es muy catastrofico
pero si se trata de un puntero el casque es inevitable. Para evitar ese
problema es por lo que ese código no es legal.
La solucion que plantea el post anterior es valida pero no exacta del todo
ya que el ambito de la variable se reduce, no es todo el switch, es decir
solo puedes usar la variable dentro de uno de los case.
--
Un saludo
Rodrigo Corral González [MVP]
FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Isidro Muñoz
2005-04-19 08:04:07 UTC
Permalink
Hola,

Mi opinión personal es que el error es de gramática, no porque el compilador
no sepa que tiene que hacer.

Existen situaciones en las que el compilador tiene que dar error porque no
sabe como hacer su trabajo, pero en este caso yo pienso que sí sabe hacerlo
pero seguramente por una regla de gramática no se permitirá.

Además si pones:
switch (var)
{
case 1:
break;

default:
int x=5;
break;
}

En este caso no dá error, el error lo da en una inicialización que
posteriormente tiene un case.
En realidad un switch, lo que usa son JMP por eso deduzco que es una regla
de gramática.

Saludos.
Isidro.
Post by El Mago de Oz
Hola, soy el que empezó este hilo; pero ahora escribo desde casa, porque en
el curro no se actualizan las news a traves de Google, que es donde la veía.
Entiendo lo que me dices, pero si eso es así, ¿porque esto otro compila
perfectamente?
switch (var)
{
int x;
x = 0;
break;
break;
}
En realidad es el mismo caso, ¿no? lo único es que en este ejemplo se da
valor a x en la linea siguiente a su declaración. ¿me equivoco?
Post by Rodrigo Corral [MVP]
switch (var)
{
int x = 0;
break;
cout << x;
break;
}
El ambito de x es el del switch se supone, siguiendo la regla general de
que las llaves delimitan el ambito de las variables, luego ese codigo
seria legal, pero puede ocurrir que entres en default y por tanto la
variable no se inicialice. En el caso de int esto no es muy catastrofico
pero si se trata de un puntero el casque es inevitable. Para evitar ese
problema es por lo que ese código no es legal.
La solucion que plantea el post anterior es valida pero no exacta del todo
ya que el ambito de la variable se reduce, no es todo el switch, es decir
solo puedes usar la variable dentro de uno de los case.
--
Un saludo
Rodrigo Corral González [MVP]
FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Continúe leyendo en narkive:
Loading...