From 72be29068a04464157c08cd590d954d39fd65999 Mon Sep 17 00:00:00 2001 From: KartikSoneji Date: Mon, 15 Jul 2019 19:01:55 +0530 Subject: [PATCH] Added info; Fixed formatting; (#36329) Added note on Scope Fixed formatting of example and added better way to rewrite example. --- guide/english/cplusplus/goto/index.md | 80 +++++++++++++++++++++------ 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/guide/english/cplusplus/goto/index.md b/guide/english/cplusplus/goto/index.md index 93fc00a136..d0f8449b3e 100644 --- a/guide/english/cplusplus/goto/index.md +++ b/guide/english/cplusplus/goto/index.md @@ -11,28 +11,76 @@ It does exactly what it is named as. It goes to the mentioned occurence of the n goto - The keyword used to go to the particular label. label - this can be named anything. -# syntax - -`goto label; //This takes the program flow to the next appearance of label.` - -goto is something that transcends all loops. To be clearer on this point, here is an example. + +# Syntax +```C++ +goto label_name; +//This takes the program flow to the next appearance of label_name. ``` -#include -using std::cout; +Labels are defined as a name, followed by a colon (**:**) +```C++ +label_name: +``` +# Scope -int main() { -for(;;) -{ -if(1) -goto label; +`goto` can only jump to a label in the **same scope** (set of braces - {}). +### Example: +```C++ +#include +int main(){ + goto x: + std::cout << "Hello World"; //no text is printed. + x: + return 0; } -label: -cout << "lol"; //here, goto is used to get out of an otherwise infinite loop. That is one of the only places where goto is tolerated. +int someFunction(){ + x: //the program does not jump to this label becaue it is in another scope. return 0; } ``` -[Try the code here!](https://wandbox.org/permlink/tG0aInbyuKJQC4ER) -**However, care must be taken to use goto very carefully.** +`goto` is something that transcends all loops. To be clearer on this point, here is an example. + +```C++ +#include +using std::cout; + +int main(){ + for(;;){ + if(1) goto label; + } + +label: + cout << "lol"; + //here, goto is used to get out of an otherwise infinite loop. That is one of the only places where goto is tolerated. + + return 0; +} +``` +[Try the code here!](https://wandbox.org/permlink/2zm4f4WMR7ybvJlQ) + +Even though the above code works, a **much** better option is to structure your code such that `goto` is not needed for the program flow. For this reason, many modern programming languages (like java, javascript, python, etc.) do support `goto`. Instead, control statements like `break` and `continue` are used. + +The above example can be rewritten using `break` as: +```C++ +#include +using std::cout; + +int main(){ + for(;;){ + if(1) break; + } + + cout << "lol"; + + return 0; +} +``` +[Try the code here!](https://wandbox.org/permlink/faRaw7paaRwWGkln) + +**However, care must be taken to use goto very carefully**, especially in the early days of coding as it can lead to crazy issues, if not understood well enough. `goto` violates the standard flow of the program, and as C++ is an object oriented language, goto should **NEVER EVER, EVER** be used in a normal program, under **ANY CIRCUMSTANCES**. The same effect can usually be replicated by using functions or loops, with the resulting code being easier to read as well as maintain. + +#### The consequences of using goto are illustrated in this XKCD comic (#292) +![](https://imgs.xkcd.com/comics/goto.png)