3.2.7. switch

Una sentencia switch selecciona un fragmento de código entre varios posibles en base al valor de una expresión entera. Su estructura es:

switch(selector) {
case valor-entero1 : sentencia; break;
case valor-entero2 : sentencia; break;
case valor-entero3 : sentencia; break;
case valor-entero4 : sentencia; break;
case valor-entero5 : sentencia; break;
    (...)
default: sentencia;
}

selector es una expresión que produce un valor entero. El switch compara el resultado de selector para cada valor entero. Si encuentra una coincidencia, se ejecutará la sentencia correspondiente (sea simple o compuesta). Si no se encuentra ninguna coincidencia se ejecutará la sentencia default.

Se puede observar en la definición anterior que cada case acaba con un break, lo que causa que la ejecución salte hasta el final del cuerpo del switch (la llave final que cierra el switch). Esta es la forma convencional de construir una sentencia switch, pero la palabra break es opcional. Si no se indica, el case que se ha cumplido «cae» al siguiente de la lista. Esto significa, que el código del siguiente case, se ejecutara hasta que se encuentre un break. Aunque normalmente no se desea este tipo de comportamiento, puede ser de ayuda para un programador experimentado.

La sentencia switch es una manera limpia de implementar una selección multi-modo (por ejemplo, seleccionando de entre un número de paths de ejecución), pero requiere un selector que pueda evaluarse como un entero en el momento de la compilación. Si quisiera utilizar, por ejemplo, un objeto string como selector, no funcionará en una sentencia switch. Para un selector de tipo string, se debe utilizar una serie de sentencias if y comparar el string dentro de la condición.

El ejemplo del menu demostrado anteriormente proporciona un ejemplo particularmente interesante de un switch:

//: C03:Menu2.cpp
// A menu using a switch statement
#include <iostream>
using namespace std;

int main() {
  bool quit = false;  // Flag for quitting
  while(quit == false) {
    cout << "Select a, b, c or q to quit: ";
    char response;
    cin >> response;
    switch(response) {
      case 'a' : cout << "you chose 'a'" << endl;
                 break;
      case 'b' : cout << "you chose 'b'" << endl;
                 break;
      case 'c' : cout << "you chose 'c'" << endl;
                 break;
      case 'q' : cout << "quitting menu" << endl;
                 quit = true;
                 break;
      default  : cout << "Please use a,b,c or q!"
                 << endl;
    }
  }
} ///:~

Listado 3.7. C03/Menu2.cpp


El flag quit es un bool, abreviatura para «booleano», que es un tipo que sólo se encuentra en C++. Puede tener únicamente los valores true o false. Seleccionando q se asigna el valor true al flag «quit». La próxima vez que el selector sea evaluado, quit == false retornará false de modo que el cuerpo del bucle while no se ejecutará.