while문은 특정 조건을 주고 그 조건을 만족하는 동안 특정 영역을 계속해서 반복하는 반목문이다.
while(num < 3) // 반복의 조건은 num < 3
{
printf("Hello world! \n");
num++;
}
소괄호 안에는 반복의 조건을 명시하고, 이 조건이 만족되는 동안 중괄호 안에 존재하는 코드가 반복 실행되는 구조이다.
1. num의 값이 0부터 시작한다고 가정한다.
num은 0이니 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
2. num의 값은 1로 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
3. num의 값은 2로 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
4. num의 값은 3으로 조건에 충족하지 않고, 이때 while문을 탈출해 그 다음 행을 실행하게 된다.
만약 num++; 의 문장이 존재하지 않아 num의 값이 증가하지 않는다면, 계속 조건을 충족하므로 프로그램이 종료되지 않고 계속 실행된다. 이를 무한루프라고 한다.
따라서 반복문에서는 반복의 조건을 무너뜨리기 위한 최소한의 연산이 필요하다.
while(num < 3)
printf("Hello world! \n", num++);
int main(void)
{
int num = 0;
while(num < 3) // 3회 반복
{
printf("Hello world! \n");
num++;
}
...
}
이후에 2단계와 3단계를 반복하다가, 2단계에서 비교연산의 결과가 '거짓'으로 나온다면(조건에 만족하지 않는다면), 반복영역을 실행하지 않고 while문을 탈출한다.

반복조건이 와야 할 위치에 0이 아닌 값이 올 경우, 무한루프가 형성된다.
while( 1 )
{
printf("Hello world! \n");
}
1은 '참'을 의미하는 대표적인 값이므로 반복조건은 항상 '참'이 되어 빠져나가지 못하는 반복문이 구성된다.
무한루프는 프로그래머의 실수가 아닌, 필요에 의해서 만들어지기도 한다.
'while문의 중첩'은 while문 안에 while문이 포함된 상황을 뜻한다.
#include <stdio.h>
int main(void)
{
int cur = 2;
int is = 0;
while(cur < 10) // 2단에서 9단까지 반복
{
is = 1;
while(is < 10) // 각 단의 1부터 9의 곱
{
printf("%d × %d = %d \n", cur, is, cur*is);
is++;
}
cur++; // 다음 단으로 넘어가기 위한 증가
}
return 0;
}
이처럼 while문의 중첩을 통해 코드를 간소화 할 수 있다.
while문과 do~while문의 차이는 반복의 조건을 검사하는 시점에 있다.
do~while문은 반복조건을 뒷부분에서 검사한다. 이렇듯 반복조건을 뒷부분에서 검사하기 때문에 반복영역을 최소한 한번은 실행하는 구조이다. while문은 반복조건을 만족하지 못하면 반복영역을 한번도 실행하지 않는다.
do
{
printf("Hello world! \n");
num++;
} while (num < 3)
do 다음에 등장하는 중괄호가 반복영역이고, 중괄호에 이어서 등장한 것이 반복 조건이다. 위의 코드는 다음 실행흐름을 갖는다.
반복여부 확인 후, 조건에 맞지 않다면 do ~ while문을 탈출한다.
do~while문과 while문은 매우 유사하기 때문에 while문은 do~while문으로, do~while문은 while문으로 바꿀 수 있다.
while(num<10)
{
printf("%d×%d=%d \n", dan, num, dan*num);
num++;
}
do
{
printf("%d×%d=%d \n", dan, num, dan*num);
num++;
} while(num<10);
그럼 while문은 언제 쓰는거고, do~while문은 언제쓰는 걸까?

반복의 횟수가 정해져 있다면 while문은 다음과 같이 구성하게 된다.
int main(void)
{
int num=0; //필수요소1. 반복을 위한 변수 선언
while(num<3) //필수요소2. 반복의 조건 검사
{
printf("Hi! \n");
num++; //필수요소3. 반복의 조건을 거짓으로 만들기 위한 연산
}
}
정해진 횟수의 반복문을 구성하려면, 주석을 통해 표현한 필수요소 중 어느 것 하나라도 생략할 수 없다. 이 필수요소들을 한 데 묶어 반복문의 반복횟수를 판단하기가 한결 수월해지는데, 이것이 바로 for문이다.
필수 요소들을 한데 묶어 for문으로 표현한다면,
for(초기식; 조건식; 증감식;) 이다.
따라서 앞서 보인 while문은 다음과 같이 변경이 가능하다.
int main(void)
{
for(int num=0; num<3; num++)
printf("Hi! \n");
}
비교해보면 반복문이 훨씬 간결해졌다.
초기식은 반복을 시작하기에 앞서 딱 한번 실행된다.
조건식은 매 반복의 시작에 앞서 실행되며, 결과를 기반으로 반복 유무를 결정한다.
증감식은 매 반복 실행 후 마지막에 연산이 이뤄진다.
for문이 while문보다 간결하면, while문은 쓸 필요가 없지 않은가?
for문은 기본적으로 초기식, 조건식, 증감식을 채울 수 있지만, 필요 없는 부분이 있다면 채우지 않아도 된다. 하지만 for문의 중간에 위치한 '조건식'이 비워지면 무조건 '참'으로 인식이 되어 무한루프를 형성하게 된다.
while문의 중첩에서 썼던 구구단 전체를 출력하는 예제를 for문으로 나타낼 수 있다.
int main(void)
{
int cur, is;
for(cur=2; cur<10; cur++)
{
for(is=1; is<10; is++)
printf("%d×%d=%d \n", cur, is, cur*is);
printf("\n");
}
return 0;
}