Verwendung der goto-Anweisung in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden die goto-Anweisung Implementieren Sie Programmkontrollflusssprünge in C++
  2. Verwendung der goto-Anweisung zur Implementierung einer schleifenartigen Iteration in C++
Verwendung der goto-Anweisung in C++

In diesem Artikel wird vorgestellt, wie man die goto-Anweisung in C++ verwendet.

Verwenden die goto-Anweisung Implementieren Sie Programmkontrollflusssprünge in C++

Die Anweisung goto zwingt den Kontrollfluss des Programms, zu der Zeile zu springen, auf die das Label zeigt. Im Allgemeinen kann jede Anweisung in C++ mit einer speziellen Notation gekennzeichnet werden, die aus einem Bezeichner gefolgt von einem Doppelpunkt besteht. Üblicherweise stehen diese Label-Bezeichner überall im Funktionsumfang zur Verfügung. So kann auf sie durch goto-Anweisungen verwiesen werden, die vor dem Label stehen. Die vorherige Gültigkeitsbereichsregel unterscheidet sich von der für Variablen - sie erzwingt die Deklaration der Variablen, bevor sie von anderen Anweisungen verwendet werden.

Beachten Sie jedoch, dass goto nicht vorwärts in einen Gültigkeitsbereich springen und Anweisungen zur Variablendeklaration überspringen kann, die Initialisierer, nicht triviale Konstruktoren/Destruktoren oder nicht skalare Typen haben. Andernfalls wird erwartet, dass der Compilerfehler ausgelöst wird. Im folgenden Beispiel suchen wir nach dem ersten Auftreten des angegebenen Strings im Text, und sobald er gefunden ist, wird die Schleife mit der Anweisung goto unterbrochen, um die Steuerung am Ende des Programms zu verschieben. Als Ergebnis wird die Anweisung cout, die die Fehlermeldung anzeigt, übersprungen und nur ausgeführt, wenn kein String mit dem vom Benutzer übergebenen String-Wert übereinstimmt.

#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;
}

Alternativ können wir das vorherige Beispiel mit einer Validierungsfunktion für Benutzereingaben erfüllen, die dem Code in Bezug auf das ausfallsichere Verhalten mehr Robustheit verleiht. cin-Memberfunktionen werden verwendet, um die Funktionalität der Eingabeüberprüfung zu implementieren und die Referenz auf die gelesenen Daten zurückzugeben.

#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;
}

Verwendung der goto-Anweisung zur Implementierung einer schleifenartigen Iteration in C++

Die goto-Anweisung kann verwendet werden, um ein schleifenähnliches Verhalten zu implementieren, bei dem die if-Bedingung jede Iteration auswertet und bestimmt, ob das Steuerelement die Schleife verlässt. Beachten Sie, dass wir den Schleifenkörper mit den Namen START und END beschriftet haben. Grundsätzlich erhöht die Iteration die Variable score, bis sie grösser als 1000 ist. Daher bricht die Iteration ab, wenn der Wert 1001 auswertet, und an diesem Punkt springt das Programm in die Zeile, in der die Anweisung cout aufgerufen wird.

#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;
}

Ausgabe:

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

Verwandter Artikel - C++ Statement