2011-10-04 15 views
5

poco me encontré con un código C++ como el siguiente:Ramas ambiguas if y else: ¿se define el comportamiento?

if(test_1) 
    if(test_2) 
    { 
     // Do stuff 
    } 
    else 
     exit(0); 

Ésta es ambigua, ya que el compilador podría ver esto como:

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
    else 
    { 
    } 
} 

o como:

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
} 
else 
{ 
} 

Es el comportamiento de este código definido de acuerdo con cualquier estándar (C, C++)? Vi este código en un programa de C++ en VC++, que parece preferir la primera solución.

+3

Esto no es * ambiguo *, ya que el estándar determina cómo se debe analizar, puede * parecer * ambiguo para usted, pero no es para el compilador u otros programadores que saben cómo se analiza. –

+1

Es posible que desee leer esto: http://en.wikipedia.org/wiki/Dangling_else y esto: http://drdobbs.com/blogs/cpp/231602010. – sbi

Respuesta

11

¿El comportamiento de este código está definido según cualquier estándar (C, C++)?

Sí, está definido. En C (y todos los idiomas similares que yo sepa), el "colgando otra cosa" se une a la última libre si, por lo tanto, esta interpretación

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
    else 
    { 
    } 
} 

es correcta.

+8

+1 Pero como nota (para el OP), muchos consideran que un buen estilo de escritura SIEMPRE SIEMPRE SIEMPRE pone llaves por estos (y otros) motivos. No por la ambigüedad del compilador (inexistente), sino por la ambigüedad humana y la estupidez. – xanatos

1

Está bien definido. else siempre está emparejado con el if más cercano disponible.

4

No hay ambigüedad. La cláusula else siempre se refiere a la if más cercana a la que se puede adjuntar. A partir de las declaraciones (6.4 Selección) C++ standard:

En la cláusula 6, el término substatement se refiere a la declaración contenida o declaraciones que aparecen en la notación de sintaxis. La subposición en una declaración de selección (cada subposición, en la forma else de la sentencia if) define implícitamente un alcance local (3.3).

Si la subestación en una declaración de selección es una sola declaración y no una declaración compuesta, es como si se reescribiera para ser una declaración compuesta que contiene la subposición original. [Ejemplo:

if (x) int i; 

puede equivalentemente reescribirse como

 if (x) { 
      int i; 
    } 

Se produce que el código que escribió se puede reescribir como:

if(test_1) 
{ 
    if(test_2) 
    { 
     // Do stuff 
    } 
    else 
    { 
     exit(0); 
    } 
} 
0

Se define en C. Un else siempre se empareja con el if más cercano; , por lo tanto, debe usar las llaves adecuadas para evitar ambigüedades.