¿Es “else if” una sola palabra clave?

6 minutos de lectura

avatar de usuario
modelador

Soy nuevo en C++. A menudo veo una declaración condicional como la siguiente:

if 
  statement_0;
else if
  statement_1;

Pregunta:

sintácticamentevoy a tratar else if como una sola palabra clave? ¿O es en realidad un anidado if declaración dentro del exterior else ¿como abajo?

if 
  statement_0;
else 
  if
    statement_1;

  • A tu segundo punto. Sintácticamente es casi siempre escrito else if

    – ElNorteWes

    23 de junio de 2014 a las 18:46

  • No, porque eso complicaría aún más la gramática: una palabra es una palabra sin espacio. Sin embargo, otros idiomas tienen palabras clave como elseif y ELIF. De hecho solo (?) el lenguaje de programación Algol68 permite un espacio en un identificador; agradable tambien: PROC walk through tree ()

    – Joop Eggen

    23 de junio de 2014 a las 18:48


  • Fortran (al menos las versiones de forma fija) y todas las versiones estandarizadas de Algol permiten espacios en cualquier lugar. Una historia dice que aparentemente los perforadores de tarjetas perforadas eran propensos a agregar espacios al escribir el código; otro simplemente que permitir espacios en los nombres de las variables permitiría a los programadores usar mejores nombres y no se previeron los problemas.

    – prosfilaes

    24 de junio de 2014 a las 7:52

  • los elseif la palabra clave existe en VB y PHP.

    – Salmán A.

    25 de junio de 2014 a las 7:08

  • Nitpick: aunque C++ oficialmente no tiene palabras clave con espacios en ellas, tiene construcciones como para todos los intentos y propósitos funcionan de esa manera. Por ejemplo, long doubletienes que escribir eso de esa manera. longdouble Es incorrecto.

    – Señor Lister

    25 de junio de 2014 a las 9:12


avatar de usuario
Shafik Yaghmour

No son una sola palabra clave si vamos a la borrador del estándar C++ sección 2.12 Palabras clave mesa 4 enumera ambos if y else por separado y no hay else if palabra clave. Podemos encontrar una lista más accesible de C++ palabras clave yendo a sección cppreferences sobre palabras clave.

La gramática en la sección 6.4 también lo deja claro:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

los if en else if es un declaración siguiendo el else término. La sección también dice:

[…]La subdeclaración en un declaración de selección (cada subdeclaración, en el
más forma de la si instrucción) define implícitamente un ámbito de bloque (3.3). Si el subenunciado en un enunciado de selección es un solo enunciado y no un declaración compuestaes como si se reescribiera para que fuera una declaración compuesta que contiene la subsentencia original.

y proporciona el siguiente ejemplo:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Entonces, ¿cómo se analiza su ejemplo ligeramente extendido?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

se analizará así:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

Nota

También podemos determinar que else if no puede ser una palabra clave al darse cuenta de que palabras clave son identificadores y podemos ver en la gramática de un identificador en mi respuesta a ¿Puedes comenzar un nombre de clase con un dígito numérico? que no se permiten espacios en identificadores y por lo tanto else if no puede ser un solo palabra clave pero deben ser dos separados palabras clave.

  • ¿Podrías deducir esto sin el estándar? En ASM es: jeq (if | else if), jne (if | else if), jmp (else). Basado en eso, habría dicho que era una sola palabra clave… probablemente no sintácticamente sino en cuanto a instrucciones.

    – Brandón

    23 de junio de 2014 a las 23:02


  • @Brandon Dudo mucho que pueda pasar de manera confiable del lenguaje ensamblador a construcciones de alto nivel sin un conocimiento íntimo de la gramática que se usa y el compilador en sí.

    – Shafik Yaghmour

    24 de junio de 2014 a las 13:52

  • Aunque tenga en cuenta que esta definición potencialmente conduce al maravilloso problema del árbol de sintaxis ambigua “colgando más” al definir la gramática en el analizador …

    – Lineal

    24 de junio de 2014 a las 16:15


  • Algunos idiomas no son compatibles else ifpero en lugar elsif. En esos idiomas, else if es verdaderamente una palabra clave. Sin embargo, los lenguajes basados ​​en C generalmente no lo hacen, como dice esta respuesta.

    – sfdcfox

    25 de junio de 2014 a las 14:15

  • Creo que @Krumia quería ver una final. else declaración. Apreciaría esto, también.

    – Matías

    15 de julio de 2014 a las 20:11


Sintácticamente, no es una sola palabra clave; las palabras clave no pueden contener espacios en blanco. Lógicamente, al escribir listas de else
if
probablemente sea mejor si míralo como una sola palabra clave y escribe:

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

El compilador literalmente ve esto como:

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

pero ambas formas dan como resultado lo mismo, y la primera es mucho más legible.

  • En realidad, el compilador no vio literalmente else seguido de un compound-statement. Después de un elsebusca statement (que podría ser como return; o f()) o un compound-statement

    – La máscara

    23 de junio de 2014 a las 19:08

  • @TheMask: según la respuesta anterior de Shafik Yaghmour, el compilador literalmente ve una sola declaración, pero finge vio una declaración compuesta.

    – Ilmari Karonen

    24 de junio de 2014 a las 8:45

  • Esta respuesta dicta cómo el analizador extrae los tokens. Bien.

    – trucos

    26 de junio de 2014 a las 9:12

No, no es.
Son dos palabras clave y, además, el segundo “if” es una subdeclaración “dentro” del alcance determinado por la primera declaración “else”.

  • Aunque esto describe bien lo que está pasando, es posible que desee agregar algunas referencias para las definiciones del idioma real para demostrar mejor lo que está diciendo.

    – πάντα ῥεῖ

    23/06/2014 a las 19:00

  • @πάνταῥεῖ: Tienes razón sobre las referencias, pero Shafik Yaghmour ha hecho bien este trabajo. Su respuesta fue la aceptada y también he votado a favor. Mi trabajo ha terminado aquí.

    – pablo1977

    23 de junio de 2014 a las 19:03

Puede ver el alcance usando llaves:

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

Y normalmente implementado con dos palabras clave distintas, una es si y uno es más.

avatar de usuario
La máscara

Como ya se respondió, no lo es. Son dos palabras clave. Es el comienzo de dos declaraciones, una seguida de la otra. Para tratar de hacerlo un poco más claro, aquí está la gramática BNF que se ocupa de if y else sentencias en lenguaje C++.

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

Tenga en cuenta que statement sí mismo incluyen selection-statement. Entonces, combinaciones como:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

son posibles y válidos según el estándar/semántica de C++.

Nota: la gramática de C++ se toma de este página.

avatar de usuario
Shafik Yaghmour

más y si son dos C++ diferentes palabras clave. Un si declaración puede ir seguida de una opción más simás declaración. Un si declaración puede tener cero o más más si‘s y deben presentarse ante el más.

Puede encontrar la sintaxis y el ejemplo en este tutorial de declaración if…else

avatar de usuario
Comunidad

Sólo me gustaría añadir mi punto de vista a todas estas explicaciones. Tal como lo veo, si puede usar estas palabras clave por separado, deben ser DOS palabras clave. Tal vez pueda echar un vistazo a la gramática de c ++, desde este enlace en stackoverflow: ¿Existe una gramática estándar de C ++?

Saludos

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad