Declaración dentro de un switch - case

13/04/2005 - 16:44 por pgsanchez | Informe spam
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

Preguntas similare

Leer las respuestas

#1 Sergio
13/04/2005 - 17:52 | Informe spam
Pedro wrote:
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




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)
Respuesta Responder a este mensaje
#2 Rodrigo Corral [MVP]
13/04/2005 - 23:11 | Informe spam
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
Respuesta Responder a este mensaje
#3 El Mago de Oz
19/04/2005 - 00:19 | Informe spam
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?



"Rodrigo Corral [MVP]" escribió en el mensaje
news:
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


Respuesta Responder a este mensaje
#4 Isidro Muñoz
19/04/2005 - 10:04 | Informe spam
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.

"El Mago de Oz" escribió en el mensaje
news:d41bpl$mkr$
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?



"Rodrigo Corral [MVP]" escribió en el mensaje
news:
> 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
>
>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida