2011-09-30 16 views
9

Me disculpo por esta pregunta demasiado simplista, pero me parece que no puede averiguar este ejemplo en el libro que estoy leyendo:¿Alguien puede explicar este fragmento (¿Por qué estos refuerzos están aquí)?

void f5() 
{ 
    int x; 
    { 
     int y; 
    } 
} 

¿Cuáles son los corchetes que rodean las int y para? ¿Puedes poner llaves cuando quieras? Si es así, ¿cuándo y por qué lo harías o es solo un error en el libro?

+2

Esta es una técnica, principalmente aplicada en el lenguaje C, para crear valores temporales locales después de la primera instrucción. Cuando la ejecución sale de la llave de cierre, todas las variables creadas dentro de ese alcance desaparecen. –

Respuesta

13

Las llaves de ese tipo indican que el código dentro de las llaves se encuentra ahora en un ámbito diferente. Si intentas acceder a y fuera de los corchetes, recibirás un error.

+0

Eso tiene sentido, pero lo que me confunde es que creo que debería estar dentro de una función. Si solo puede colocar llaves dentro de una función, no veo por qué alguna vez tendría que usar una función anidada. ¿O estoy en el jardín izquierdo en alguna parte? – Gary

+4

Una función tiene su propio alcance, pero también es posible tener alcance dentro de una función. Esto puede ser muy útil, por ejemplo, los objetos C++ tienen destructores y estos se pueden usar para liberar recursos en un punto particular cuando el objeto se sale del alcance. Es posible que desee hacer esta función intermedia. – Benj

4

Es un alcance definitorio. La variable Y no es accesible fuera de las llaves.

4

Las llaves indican alcance, la variable x será visible en el alcance de la llave interna pero y no será visible fuera del alcance de la abrazadera.

3

Las llaves definen un nivel de alcance. Fuera de las llaves, y no estará disponible.

1

que se parece a un error (no conocer el contexto)

Hacer que haya en caja el valor de y dentro de esos apoyos, y como tal no está disponible fuera de ella.

Por supuesto, si están tratando de explicar el alcance, que podría ser un código válido

6

Es una cuestión de variables de alcance, por ejemplo:

void f5() 
{ 
    int x = 1; 
    { 
     int y = 3; 
     y = y + x;   // works 
     x = x + y;   // works 
    } 
    y = y + x;    // fails 
    x = x + y;    // fails 
} 
3

A la salida alcance los objetos internos se destruyen . Puede, por ejemplo, incluir una sección crítica entre llaves y construir un objeto de bloqueo allí. Entonces no tiene que preocuparse por olvidarse de desbloquearlo: el destructor se llama automáticamente al salir del alcance, ya sea normalmente o debido a una excepción.

Cuestiones relacionadas