Utilize a instrução goto em C++
-
Use a instrução
goto
Implementar Saltos de Fluxo de Controle de Programa em C++ -
Use a instrução
goto
para implementar a iteração de estilo de loop 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
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