Utilice la instrucción goto en C++

Jinku Hu 12 octubre 2023
  1. Utilice la declaración goto Implementar saltos de flujo de control del programa en C++
  2. Utilice la instrucción goto para implementar la iteración de estilo de bucle en C++
Utilice la instrucción goto en C++

Este artículo presentará cómo utilizar la instrucción goto en C++.

Utilice la declaración goto Implementar saltos de flujo de control del programa en C++

La declaración goto obliga al flujo de control del programa a saltar a la línea señalada por la etiqueta. Generalmente, cualquier declaración en C++ se puede etiquetar usando una notación especial, que consiste en un identificador seguido de dos puntos. Por lo general, estos identificadores de etiquetas están disponibles en todas partes del alcance de la función. Por lo tanto, se puede hacer referencia a ellos mediante declaraciones goto que se encuentran antes de la etiqueta. La regla de alcance anterior es diferente de la de las variables, que obliga a declarar las variables antes de que otras declaraciones las utilicen.

Sin embargo, tenga en cuenta que goto no puede saltar hacia adelante en un ámbito y omitir declaraciones de declaración de variables que tienen inicializadores, constructores/destructores no triviales o tipos no escalares. De lo contrario, se espera que surja el error del compilador. En el siguiente ejemplo, buscamos la primera aparición de la cadena dada en el texto, y una vez que se encuentra, el bucle se rompe con la instrucción goto para mover el control al final del programa. Como resultado, la declaración cout que indica el mensaje de falla se omite y solo se ejecuta cuando ninguna cadena coincide con el valor de cadena pasado por el usuario.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string text(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
      " Nam mollis felis eget diam fermentum, sed consequat justo pulvinar. ");
  string search_query;

  cout << "Enter a string to search: ";
  cin >> search_query;

  std::istringstream iss(text);
  string word;
  while (iss >> word) {
    if (word == search_query) {
      cout << "'" << search_query << "' - found in text" << endl;
      goto END;
    }
  }
  cout << "Could not find such string!" << endl;
END:

  return EXIT_SUCCESS;
}

Alternativamente, podemos cumplir con el ejemplo anterior con una función de validación de entrada de usuario que agrega más robustez al código en términos de comportamiento a prueba de fallas. Las funciones miembro cin se utilizan para implementar la funcionalidad de verificación de entrada y devolver la referencia a los datos que se leyeron.

#include <iostream>
#include <limits>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
T &validateInput(T &val) {
  while (true) {
    cout << "Enter a string to search: ";
    if (cin >> val) {
      break;
    } else {
      if (cin.eof()) exit(EXIT_SUCCESS);
      cout << "Enter a string to search:\n";
      cin.clear();
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }
  return val;
}

int main() {
  string text(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
      " Nam mollis felis eget diam fermentum, sed consequat justo pulvinar. ");
  string search_query;

  validateInput(search_query);

  std::istringstream iss(text);
  string word;
  while (iss >> word) {
    if (word == search_query) {
      cout << "'" << search_query << "' - found in text" << endl;
      goto END;
    }
  }
  cout << "Could not find such string!" << endl;
END:

  return EXIT_SUCCESS;
}

Utilice la instrucción goto para implementar la iteración de estilo de bucle en C++

La declaración goto se puede utilizar para implementar un comportamiento de tipo bucle, donde la condición if evalúa cada iteración y determina si el control saldrá del bucle. Observe que etiquetamos el cuerpo del bucle con los nombres START y FIN. Básicamente, la iteración incrementa la variable puntuación hasta que es mayor que 1000. Por lo tanto, la iteración se interrumpe cuando el valor evalúa 1001 y en ese punto, el programa se mueve a la línea donde se llama a la instrucción cout.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  int score = 1;

START:
  if (score > 1000) goto EXIT;

  score += 1;
  goto START;
EXIT:
  cout << "score: " << score << endl;

  return EXIT_SUCCESS;
}

Producción :

score: 1001
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Statement