Utilizza l'istruzione goto in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’istruzione goto Implementa i salti di flusso di controllo del programma in C++
  2. Usa l’istruzione goto per implementare l’iterazione in stile loop in C++
Utilizza l'istruzione goto in C++

Questo articolo introdurrà come utilizzare l’istruzione goto in C++.

Usa l’istruzione goto Implementa i salti di flusso di controllo del programma in C++

L’istruzione goto forza il flusso di controllo del programma a saltare alla linea indicata dall’etichetta. In genere, qualsiasi istruzione in C++ può essere etichettata utilizzando una notazione speciale, che consiste in un identificatore seguito da due punti. Di solito, questi identificatori di etichetta sono disponibili ovunque nell’ambito della funzione. Quindi, possono essere indicati da dichiarazioni goto che si trovano prima dell’etichetta. La precedente regola dell’ambito è diversa da quella per le variabili, che impone la dichiarazione delle variabili prima che vengano utilizzate da altre istruzioni.

Si noti, tuttavia, che goto non può saltare in avanti in un ambito e saltare le dichiarazioni di dichiarazione di variabili che hanno inizializzatori, costruttori/distruttori non banali o tipi non scalari. In caso contrario, è previsto che venga generato l’errore del compilatore. Nell’esempio seguente, cerchiamo la prima apparizione della stringa data nel testo, e una volta trovata, il bucle viene interrotto con l’istruzione goto per spostare il controllo alla fine del programma. Di conseguenza, l’istruzione cout che indica il messaggio di errore viene ignorata ed eseguita solo quando nessuna stringa corrisponde al valore della stringa passato dall’utente.

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

In alternativa, possiamo completare l’esempio precedente con una funzione di convalida dell’input dell’utente che aggiunge più robustezza al codice in termini di comportamento a prova di errore. Le funzioni membro cin sono utilizzate per implementare la funzionalità di controllo dell’input e restituire il riferimento ai dati che sono stati letti.

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

Usa l’istruzione goto per implementare l’iterazione in stile loop in C++

L’istruzione goto può essere utilizzata per implementare un comportamento simile a un bucle, in cui la condizione if valuta ogni iterazione e determina se il controllo uscirà dal bucle. Nota che abbiamo etichettato il corpo del bucle con i nomi START e END. Fondamentalmente, l’iterazione incrementa la variabile score finché non è maggiore di 1000. Pertanto, l’iterazione si interrompe quando il valore valuta 1001 e a quel punto il programma si sposta sulla riga in cui viene chiamata l’istruzione 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;
}

Produzione:

score: 1001
Autore: 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

Articolo correlato - C++ Statement