教科書上寫到儘量不用它,以免增加程式的複雜度,
以下就是一個很標準因為goto使用不當的鬼打牆的程式...
1 /******************************
2 * goto program 1
3 ******************************/
4 void function(void)
5 {
6 int i = 0;
7
8 label1:
9 printf("Hello World\n");
10 if (i != 0)
11 {
12 return;
13 }
14 goto label3;
15
16 label2:
17 printf("What is it?\n");
18 i = 1;
19 goto label1;
20
21 label3:
22 printf("Here is it\n");
23 goto label2;
24 }
25
但有些狀況宅爸爸沒用goto這東西會讓程式變的很容易出錯,這是一個很矛盾的狀況...
1 /******************************
2 * goto program 2
3 * This is a C pseudo code
4 ******************************/
5 int function(void)
6 {
7 int ret = -1;
8 Handle h1, h2, h3;
9
10 h1 = HandleOpen(...);
11 if (error == h1)
12 {
13 goto return_f;
14 }
15
16 h2 = HandleOpen(...);
17 if (error == h2)
18 {
19 goto close_h1;
20 }
21
22 /* Error happened ... */
23 if (error)
24 {
25 goto close_h2;
26 }
27
28 h3 = HandleOpen(...);
29 if (error == h3)
30 {
31 goto close_h2;
32 }
33
34 /* Error happened ... */
35 if (error)
36 {
37 goto close_h3;
38 }
39
40 /* Other code ... */
41
42 ret = 0;
43 close_h3:
44 HandleClose(h3);
45 close_h2:
46 HandleClose(h2);
47 close_h1:
48 HandleClose(h1);
49 return_f:
50 return ret;
51 }
52
尤其是在事後修改、維護這些程式時,program 1我會很容易搞混,而program 2比較有效率。
如果program2沒有用goto,return的處理就很麻煩,情況如下...
1 /******************************
2 * goto program 3
3 * This is a C pseudo code
4 ******************************/
5 int function(void)
6 {
7 int ret = -1;
8 Handle h1, h2, h3;
9
10 h1 = HandleOpen(...);
11 if (error == h1)
12 {
13 return ret;
14 }
15
16 h2 = HandleOpen(...);
17 if (error == h2)
18 {
19 HandleClose(h1);
20 return ret;
21 }
22
23 /* Error happened ... */
24 if (error)
25 {
26 HandleClose(h1);
27 return ret;
28 }
29
30 h3 = HandleOpen(...);
31 if (error == h3)
32 {
33 HandleClose(h1);
34 HandleClose(h2);
35 return ret;
36 }
37
38 /* Error happened ... */
39 if (error)
40 {
41 HandleClose(h1);
42 HandleClose(h2);
43 HandleClose(h3);
44 return ret;
45 }
46
47 /* Other code ... */
48
49 ret = 0;
50 return ret;
51 }
52
program 2若要修改,要增加一個return點,只要goto到合適的地方就行。
program 3的處理情況,要重複的關閉已開啟的handle,再做return,科科...。
goto在C語言中式保留字,不是函數,是無條件的跳躍到指定的程式中,但只限於單一函式範圍內。
No comments:
Post a Comment