C언어 goto문

프로그래밍/C 2018.12.14 댓글 Plorence
goto문

goto의 의미는 프로그램의 흐름을 원하는 위치로 이동 하는겁니다.

goto문은 코드를실행하다가 goto문을만나면 지정한 레이블로 넘어갑니다.
goto rabbit: 을하면 rabbit:이 위치한 레이블로 이동하여 아래의코드를 실행합니다.
그럼 그전의 코드는 실행되지 않습니다.

goto문에 대해서 논란도 많았습니다. 가장큰원인은 프로그램의 자연스러운 흐름을 방해하기 때문입니다.
C언어와 같은 절차지향 프로그래밍 언어에서는 흐름을 복잡하게하거나 방해하는것은 아주 큰 단점 이기 때문입니다.

결국 goto문의 사용은 가급적 자제하거나,아예 사용하지말자는 결론을 내렸습니다.
물론 적절하게 써주면 좋습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main(void)
{
    int num1;
    scanf("%d",&num1);
    if(num1 == 1){
        goto ONE;
    }
    else{
        goto TWO;
    }
ONE:
    printf("num1은 1입니다.");
goto END;
TWO:
printf("num1은 1이 아닙니다.");
END:
    
    return 0;
}
이런식으로 사용할 수 있습니다.
근데 위코드는 goto문을 안써도 될것같은 느낌이 든다면 지극히 정상입니다. (물론 써도 되긴 합니다만..)
굳이 goto문을안쓰고 그자리에서 바로 출력을하면 됩니다.
줄도 길어지고 흐름도 방해하고 복잡해집니다.
언제 써야 되나?
Goto를 안썼을때
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
BOOL function( void )
{
HANDLE hFile1, hFile2, hFile3;
PVOID pMem1, pMem2, pMem3;
hFile1 = hFile2 = hFile3 = INVALID_HANDLE;
pMem1 = pMem2 = pMem3 = NULL;
hFile1 = CreateFile(...);
if( hFile1 == INVALID_HANDLE )
{
return FALSE;
}
hFile2 = CreateFile(...);
if( hFile2 == INVALID_HANDLE )
{
Close(hFile1)
return FALSE;
}
hFile3 = CreateFile(...);
if( hFile3 == INVALID_HANDLE )
{
Close(hFile1)
Close(hFile2)
return FALSE;
}
pMem1 = malloc( );
if ( pMem1 == NULL)
{
Close(hFile1)
Close(hFile2)
Close(hFile3)
return FALSE;
}
pMem2 = malloc( );
if ( pMem2 == NULL)
{
free( pMem1 )
Close(hFile1)
Close(hFile2)
Close(hFile3)
return FALSE;
}
pMem3 = malloc( );
if ( pMem3 == NULL)
{
free( pMem1 )
free( pMem2 )
Close(hFile1)
Close(hFile2)
Close(hFile3)
return FALSE;
}
.....
.....
Close(hFile1)
Close(hFile2)
Close(hFile3)
free( pMem1 )
free( pMem2 )
free( pMem3 )
return TRUE;
}
Goto를 사용했을때
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
BOOL function( void )
{
HANDLE hFile1, hFile2, hFile3;
PVOID pMem1, pMem2, pMem3;
BOOL  bRet = FALSE;
hFile1 = hFile2 = hFile3 = INVALID_HANDLE;
pMem1 = pMem2 = pMem3 = NULL;
hFile1 = CreateFile(...);
if( hFile1 == INVALID_HANDLE )
goto END;
hFile2 = CreateFile(...);
if( hFile2 == INVALID_HANDLE )
goto END;
hFile3 = CreateFile(...);
if( hFile3 == INVALID_HANDLE )
goto END;
pMem1 = malloc( );
if ( pMem1 == NULL)
goto END;
pMem2 = malloc( );
if ( pMem2 == NULL)
goto END;
pMem3 = malloc( );
if ( pMem3 == NULL)
goto END;
.....
.....
bRet = TRUE;
END:
if ( hFile1 )
Close(hFile1)
if ( hFile2 )
Close(hFile2)
if ( hFile3 )
Close(hFile3)
if ( pMem1 )
free( pMem1 )
if ( pMem2 )
free( pMem2 )
if ( pMem2 )
free( pMem3 )
return bRet;
}
goto를 쓴쪽이 더 깔끔해 보입니다.
안쓴쪽은 조건문에 중복되는 코드가 많습니다.
상황에 따라 더 깔끔한 쪽을 택하면 될것 같습니다.
(위 예제는 클리앙에서 퍼왔습니다. https://www.clien.net/service/board/lecture/4092508)


댓글