What's wrong with the goto statement?

Pages: 12
I've heard people say that the goto statement isn't the way to go but why? If it isn't what is a good alternative? Please don't mind me being a noob and asking this. Thank you.
Unproperly used gotos can be dangerous and make the code unreadable ( since they may end up anywhere )
In almost every situation where a goto can be placed you can use one of if else do while while for switch break continue return or a function

http://www.cplusplus.com/doc/tutorial/control/
Last edited on
how would a while loop work?
here is the program i created that has goto statements in it.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
#include <iostream>
using namespace std;

int main()
{

int h;
int w;
int d;
int a;
int b;
int r;




cout << "Hello. Welcome to the Geometry Equation Calculator or GEC." << endl;
cout << "Finbar Curtin finished this program September 27, 2010. No purchase necessary it is freeware. Please do not say you created this." << endl;
calculations:
cout << "If you would like square and cube based calculations press 1." << endl;
cout << "If you would like triangle and pyramid based calculations press 2." << endl;
cout << "If you would like circular and sphere based calculations press 3." << endl;
cout << "If you would like to exit press 4." << endl;
cin >> b;

	// SQUARE
	if (b == 1)
	{
	square:
	cout << "If you would like to calculate the area of a rectangle press 1." << endl;
	cout << "If you would like to calculate the perimeter of a rectangle press 2." << endl;
	cout << "If you would like to calculate the area of a cuboid press 3." << endl;
	cout << "If you would like to calculate the surface area of a cuboid press 4." << endl;
	cout << "If you would like to return to the main menu press 5." << endl;
	cout << "If you would like to exit press 6." << endl;
	cin >> a;

		if (a == 1)
		{
		cout << "Enter the height of your rectangle." << endl;
		cin >> h;
		cout << "Enter the width." << endl;
		cin >> w;
		cout << "The area of your rectangle is " << h * w << endl;
		invalid:
		cout << "Press 1 to go to the main menu, press 2 to go to the square menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto square;
			}
	
			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto invalid;
			}
		
		}

		else if (a == 2)
		{
		cout << "Enter the height of your rectangle." << endl;
		cin >> h;
		cout << "Enter the width." << endl;
		cin >> w;
		cout << "The perimeter of your rectangle is " << (h * 2) + (w * 2) << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the square menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto square;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto invalid;
			}
		
		}

		else if (a == 3)
		{
		cout << "Enter the height of your cuboid." << endl;
		cin >> h;
		cout << "Enter the width." << endl;
		cin >> w;
		cout << "Enter the depth." << endl;
		cin >> d;
		cout << "The area of your cuboid is " << h * w * d << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the square menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto square;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto invalid;
			}
		}

		else if (a == 4)
		{
		cout << "Enter the height of your cuboid." << endl;
		cin >> h;
		cout << "Enter the width." << endl;
		cin >> w;
		cout << "Enter the depth." << endl;
		cin >> d;
		cout << "The surface area of your cuboid is " << (h * w * 2) + (h * d * 2) + (w * d * 2) << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the square menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto square;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto invalid;
			}
		}

		else if (a == 5)
		{
		goto calculations;
		}

		else if (a == 6)
		{
		return 0;
		}

		else
		{
		cout << "Your choice is invalid. Please try again." << endl;
		goto square;
		}
	}

	// TRIANGLE
	else if (b == 2)
	{
	cout << "Area in development." << endl;
	trivalid:
	cout << "Press 1 to go to main menu or press 2 to exit." << endl;
	cin >> a;
	
		if (a == 1)
		{
		goto calculations;
		}
		
		else if (a == 2)
		{
		return 0;
		}
		
		else
		{
		cout << "Choice in valid. Please try again." << endl;
		goto trivalid;
		}
		

	}

	else if (b == 3) //Circular
	{
	circle:
	cout << "If you would like the area of a circle press 1." << endl;
	cout << "If you would like the circumference of a circle press 2." << endl;
	cout << "If you would like the volume of a sphere press 3." << endl;
	cout << "If you would like the surface area of a sphere press 4." << endl;
	cout << "If you would like to go to the main menu press 5." << endl;
	cout << "If you would like to exit press 6." << endl;
	cin >> a;
	
		if (a == 1)
		{
		cout << "Enter the radius." << endl;
		cin >> r;
		cout << "The area of you circle is " << r*r*3.14 << endl;
		circlein:
		cout << "Press 1 to go to the main menu, press 2 to go to the circle menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto circle;
			}
			
			else if (b == 3)
			{
			return 0;
			}
		
			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto circlein;
			}
		}
		
		else if (a == 2)
		{
		cout << "Enter your diameter." << endl;
		cin >> d;
		cout << "Your circumference is " << d*3.14 << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the circle menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto circle;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto circlein;
			}
		}
		
		else if (a == 3)
		{
		cout << "Enter the radius." << endl;
		cin >> r;
		cout << "The area of your sphere is " << (r*r*r)*(4/3)*3.14 << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the circle menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto circle;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto circlein;
			}
		}

		else if (a == 4)
		{
		cout << "Enter your radius." << endl;
		cin >> r;
		cout << "Your surface area is " << (r*r)*4*3.14 << endl;
		cout << "Press 1 to go to the main menu, press 2 to go to the circle menu, or Press 3 to exit." << endl;
		cin >> b;
		
			if (b == 1)
			{
			goto calculations;
			}
		
			else if (b == 2)
			{
			goto circle;
			}

			else if (b == 3)
			{
			return 0;
			}

			else
			{
			cout << "Choice Invalid. Please try again." << endl;
			goto circlein;
			}
		}

		else if (a == 5)
		{
		goto calculations;
		}

		else if (a == 6)
		{
		return 0;
		}
		
		else
		{
		cout << "Choice Invalid. Please try again." << endl;
		goto circle;
		}
	}

	else if (b == 4)
	{
	return 0;
	}

	else
	{
	cout << "Choice Invalid. Please try again." << endl;
	goto calculations;
	}
}
Ugh, that's an example on how not to use goto :^P
Suggestion:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
bool square ()
{
    while ( true ) // loop forever, exit using return
    {
        // ~ lines 30 - 36
       if ( a == 1 )
           rectangle()
        else //...

       int b;
       do {
           cout << "Press 1 to go to the main menu, press 2 to go to the square menu, or Press 3 to exit." << endl;
           cin >> b

           if ( b == 1 )
                return true; // use in caller function to know if continue or end the program
           if ( b == 3 )
               return false;
       } while ( b != 2 ); // if the user enters 2 restart with the square, else ask again
    }
}

void rectangle()
{
   // ~ lines 40 -44
}

//...

int main()
{
    // ~ lines 17 -18
    bool restart;
    do {
          // ~ lines 20 - 24
          if ( b == 1 )
               restart = square();
          else //...
    } while ( restart );
}
Ok. I am a begginer so I'm not that advanced so is there an easier way, or could you explain that in a way that a preschooler could understand :D. By the way I am 12 so it would be nice if you could explain it in a simple way. I understand while loops and that sort of thing...
Last edited on
You could replace goto blocks with functions. Recursion should it happen is also "evil", but it's a lesser evil.

http://cplusplus.com/doc/tutorial/functions/

-Albatross
Ok. that makes sense. should I edit this program or when i create other programs should i use functions
I recommend editing this program if it's for an assignment or if someone else will ever see it. If only you will be dealing with it ever, however, then leaving it like this is fine.

Although it's good practice, rewriting it.

-Albatross
Last edited on
Well i'm 12 so I'm not taking any classes im doing this for leisure. I might rewrite it if I get bored some day. Any ideas for writing programs. I want to write one but I can't think of anything.

You could replace goto blocks with functions. Recursion should it happen is also "evil", but it's a lesser evil.
-Albatross


Albatross, could you clarify why is recursion evil ? I am in the process of writing a piece of code and I can avoid recursion but it will take a lot of efforts. Can you give clear reasons or situations where it is desirable to avoid recursion ?
Recursion can easily cause stack overflows if you aren't careful. Sometimes the code is a lot clearer with it, in which case you should use it. But if you are writing something like a factorial function, don't bother.
Is there anyway to detect stack overflows and print an error message before exiting ?
Stack overflows are sometimes very easy to detect. *hint hint*

I personally use recursion quite often and get fantastic results with it, but I'm just giving an honest warning. It's dangerous if you don't know what you're doing. :)

-Albatross
Last edited on
Recursion is only dangerous if you can make it go in a infinite loop
... or if it's so deep it uses all your stack.
So when you mean dangerous do you mean your computer turns into a thermonuclear bomb dangerous, or do you mean the program wont work dangerous?
Neither. You'll eventually end up with a program that's so complicated you won't be able to change it without breaking it. You'll litterally have to replace it with a new one.
I wish it was the nuclear bomb option, but sadly it's the more tame of the two. :(
http://www.cplusplus.com/forum/beginner/2287/
(Sorry, but that's what I'm going to say.)
closed account (EzwRko23)
Recursion is not more dangerous than using any other resource, like memory or file handles.
If you aren't careful, you can easily get out of resources (stack in this case).

Practical usage of recursion in C++ is very limited, because of:
1. lack of RCO/TCO optimization control,
2. destructors (which can perfectly disable TCO).

But these technical details do not make recursion "evil". Recursion is one of the most powerful idioms, much more powerful than plain iteration. Stateless code using tail-recursion is easier to reason about than code using loops and variables.
Last edited on
Pages: 12