Utilize a instrução goto em C++

Jinku Hu 12 outubro 2023
  1. Use a instrução goto Implementar Saltos de Fluxo de Controle de Programa em C++
  2. Use a instrução goto para implementar a iteração de estilo de loop em C++
Utilize a instrução goto em C++

Este artigo irá apresentar como utilizar a instrução goto em C++.

Use a instrução goto Implementar Saltos de Fluxo de Controle de Programa em C++

A instrução goto força o fluxo de controle do programa a pular para a linha apontada pelo rótulo. Geralmente, qualquer instrução em C++ pode ser rotulada usando uma notação especial, que consiste em um identificador seguido por dois pontos. Normalmente, esses identificadores de rótulo estão disponíveis em todo o escopo da função. Portanto, eles podem ser referenciados por instruções goto que estão localizadas antes do rótulo. A regra de escopo anterior é diferente daquela para variáveis ​​- que força as variáveis ​​a serem declaradas antes de serem usadas por outras instruções.

Observe, porém, que goto não pode avançar para um escopo e pular instruções de declaração de variável que possuem inicializadores, construtores / destruidores não triviais ou são tipos não escalares. Caso contrário, espera-se que o erro do compilador seja gerado. No exemplo a seguir, procuramos a primeira aparência da string fornecida no texto e, uma vez encontrada, o loop é interrompido com a instrução goto para mover o controle no final do programa. Como resultado, a instrução cout indicando a mensagem de falha é ignorada e executada apenas quando nenhuma string corresponde ao valor da string passado pelo usuário.

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

Como alternativa, podemos cumprir o exemplo anterior com uma função de validação de entrada do usuário que adiciona mais robustez ao código em termos de comportamento à prova de falhas. As funções de membro cin são utilizadas para implementar a funcionalidade de verificação de entrada e retornar a referência aos dados que foram lidos.

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

Use a instrução goto para implementar a iteração de estilo de loop em C++

A instrução goto pode ser usada para implementar um comportamento semelhante ao de um loop, onde a condição if avalia cada iteração e determina se o controle sairá do loop. Observe que rotulamos o corpo do loop com os nomes START e END. Basicamente, a iteração incrementa a variável score até que seja maior que 1000. Portanto, a iteração é interrompida quando o valor é avaliado como 1001 e nesse ponto, o programa se move para a linha onde a instrução cout é chamada.

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

Resultado:

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

Artigo relacionado - C++ Statement