1. do~while 문
지난시간에 for문과 while문 등의 순환문에 대해 공부했습니다. for나 while문은 순환(Loop)의 종료 조건을 앞에서 검사를 하는데 반해, do~while문은 뒤에서 검사합니다. 그러므로 최소 1번은 수행이 됩니다.
do {
statement
} while (expression);
일단 do~while문에 진입하여 statement를 수행한 후 expression을 검사합니다. 문법에서 주의할 점은 마지막에 세미콜론(;)이 붙는다는 점을 잊지 말아야 합니다.
예제로 조금 더 알아 보겠습니다. 아래 함수는 itoa라는 함수인데 정수형숫자를 문자배열로 바꿔주는 역할을 합니다.
int itoa (int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* 음수이면 */
n = -n; /* 양수로 바꾼다 */
i = 0;
do {
s[i++] = n % 10 + '0'; /* 마지막 숫자 1자리를 문자로 바꿈 */
} while ((n /= 10) > 0); /* 다음 자릿수가 있을 때까지 */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse (s);
}
위 예제에서 do~while문만 보겠습니다. 만일 n이 351이라는 정수라고 하면, do~while문 안의 문장은 나머지 연산을 통해 일의 자리숫자를 문자로 바꾸어 배열에 저장하는 역할을 합니다. 351을 10으로 나눈 나머지가 1이므로 숫자 1을 문자 '1'로 변경을 하여 배열에 넣습니다.. 그리고 while문에서 조건을 검사하는데 여기서는 351을 10으로 나눈 몫을 n에 넣고 그 값이 0보다 큰지 확인합니다. 0보다 크면 다시 수행을 하고 작거나 같으면 종료합니다. 351을 10으로 나눈 몫이 35이므로 Loop안의 문장을 다시 수행하면 35를 10으로 나눈 나머지가 5이므로 이녀석을 문자 '5'로 변경을 하여 배열에 넣습니다.
이렇게 반복을 하면 배열에 '1','5','3' 이라는 문자들의 순서로 들어가는데 마지막 reverse(s)에서 문자를 거꾸로 뒤집어 '3','5','1'로 바꿉니다. 전체적인 함수의 내용 보다 do~while문의 사용 예 정도로만 보시기 바랍니다.
2. break, continue
break문은 switch문 뿐 아니라 순환문에서 도중에 벗어나기 위해 사용합니다. for, while, do~while문에서 Loop를 벗어나기 위해 사용되며 중첩된 순환문의 경우 가장 가까운 Loop를 벗어나게 됩니다.
아래 예제는 문자배열에 공백(space)이나 탭(tab)을 제거하는 함수 trim입니다. break의 사용 예를 보도록 합시다.
int trim (char s[])
{
int n;
for (n = strlen(s)-1; n >= 0; n--) {
if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
break;
}
s[n+1] = '\0';
return n;
}
for문 안쪽에 if문을 보면 공백이 아니고, 탭문자가 아니고, 줄바꿈문자가 아니면 break문을 통해 for문에서 빠져나가게 됩니다. break문이 없다면 문자배열의 길이만큼 순환을 하게 됩니다. 이렇게 중간에 순환문에서 빠져나갈 때 break문을 사용합니다.
continue문은 순환문 내부에서 continue문 뒤의 문장을 수행하지 않고 비교부분을 곧바로 다시 실행하라는 의미입니다. continue문은 순환문에서만 사용될 수 있습니다. 다음 예제를 보겠습니다.
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
printf ("%d ", i);
}
printf ("\n");
}
for 안에서 if (i % 2 == 0) continue;를 보면 i가 짝수일 때 다시 loop의 처음으로 돌아가 조건을 검사합니다. 따라서 위 프로그램은 홀수만을 출력하게 됩니다.
PS C:\CS> .\continue.exe
1 3 5 7 9
3. goto와 label
C언어에서는 goto문은 논란이 많이 있으며, 굳이 goto문을 사용하지 않더라도 모든 종류의 프로그램을 짤 수 있습니다. 하지만, goto문을 사용하면 편한 경우가 있기는 합니다. 중첩된 깊은 Loop에서 바로 빠져나가기 위해서 사용하면 편리합니다. 앞서 순환문에서 빠져나가는 break문에 대해서 살펴봤지만, 중첩된 Loop전체를 빠져나갈 수는 없습니다.
for (...)
for (...)
for (...)
....
if (....) goto quit;
quit:
...
위와 같이 여러개의 for문으로 중첩되어 있을 때, goto문을 사용하여 전체 Loop를 빠져나가 quit: 이라고 label이 붙은 곳으로 바로 점프할 수 있습니다.
이런 특수한 경우를 제외하고 goto문을 사용하지 않는 것이 좋습니다. 왜냐면 goto문을 많이 사용한 경우 프로그램의 구조를 파악하기 힘들어 유지보수가 어렵기 때문입니다.
지금까지 순환문에 대해 알아봤습니다. 안녕!~
'프로그래밍 > C언어' 카테고리의 다른 글
C언어 공부하기 - 함수(2) (0) | 2020.08.10 |
---|---|
C언어 공부하기 - 함수(1) (0) | 2020.08.08 |
C언어 공부하기 - 순환문(1) while, for (0) | 2020.07.23 |
C언어 공부하기 - 제어문 (1) | 2020.07.21 |
C언어 공부하기 - 연산자 (0) | 2020.07.20 |
댓글