C언어 제어문

 

C언어에는 문장형식이 다섯가지 있습니다.

 

 

  1. 선언 (declare)
  2. 대입 (assignment)
  3. 함수 (function)
  4. 제어 (control)
  5. 널 (null)

 

이 다섯가지 문장들을 사용해서 C언어 프로그램을 운영합니다.

 

while 루프

while 루프를 돌려봅니다.

int main()
{
    int count = 0;

    while (count < 5)
    {
        printf("count : %d\n", count);
        count++;
    }

    return 0;
}

 

count : 0
count : 1
count : 2
count : 3
count : 4

while 루프에 들어가면 조건식 ( ) 안에 있는 검사를 합니다. 여기서 조건식의 결과는 0 혹은 1입니다. 0은 거짓 1은 참입니다.

 

조건식이 1인 경우 while 문의 코드블록에 진입하고 0이되면 { } 중괄호를 빠져나옵니다. 그래서 while문은 한번도 실행되지 않을 수 있습니다.

 

while문을 사용하는데 포커스는 조건식에 있습니다. 내부에서 count++ 로 조건식에 사용하는 변수의 값을 바꾸는 것은 결국 count 변수가 종료 조건을 만들어 줄것이기 때문입니다.

 

count 라고 하지만 실제로는 종료일지 아닐지 판단하는 기준이 됩니다.

 

가장 평이한 방식의 루프인데 이렇게 count를 사용하면 while 문이 종료할 때 count는 종료 조건보다 +1이 됩니다.

 

즉 count를 while문에서 사용할 수 있는 건 종료 후 count의 -1 이라는 거죠.

 

while 문이 돌아갈 때 매번 변수들의 상태가 어떻게 되어가는지 체크하는게 중요합니다.

 

윈도우 프로그래밍 같은 경우 GUI창을 유지하기 위해 초당 30번이상 도는데

 

while 문이 초당 30번 루프하는 것과 같습니다. 연산을 하면 초당 30번 할 수 있습니다.

 

1초에 30번동안 뭘할지 생각해보는 일도 있습니다.

 

while 무한루프

 

while 무한루프는 조건식을 항상 1로 유지하면 됩니다.

 

당신을 위해 언제까지나 실행할 것 입니다.

 

아래의 코드는 무한 while 루프입니다.

#include <stdio.h>
#include <windows.h>

int main()
{
    int count = 0;

    while (1)
    {
        printf("count : %d\n", count);
        Sleep(100);
        count++;
    }

    return 0;
}
count : 0
count : 1
count : 2
count : 3
count : 4
count : 5
count : 6
count : 7
...
...
무한루프

 

while (1) 은 항상 조건식이 1입니다. 코드블록을 빠져나갈 수 없죠.

 

Sleep 함수를 쓴 것은 무한루프는 그냥 놔두면 폭주하기 때문입니다. 그나마 시간을 줄여주면 좀 낫죠.

 

Sleep(100)은 0.1초 쉬는 것입니다. 즉 1초에 10번 실행합니다.

 

실제로는 출력지연이 있어서 약간 느린게 느껴집니다.

 

무한루프를 닫으려면 키보드 인터럽트를 활용합니다. 인터럽트란 어떤 프로세스가 실행중일 때 강제로 끼어드는 것입니다. Ctrl + C 를 누르면 운영체제가 강제 인터럽트로 종료시킵니다.

 

이런 경우 if break 문으로 종료시킬 수 있습니다.

    while (1)
    {
        printf("count : %d\n", count);
        Sleep(100);
        count++;
        if (count == 34) break;
    }

while문은 조건식이건 break 문이건 어떤 식으로든 종료할텐데 왜 이런 여러가지 옵션을 가지는지 궁굼할 수도 있습니다.

 

일단 C언어의 특징은 프로그래머에게 최대한의 재량권을 준다는 철학이 있습니다.

 

C언어를 만든 목적이 일반 애플리케이션을 만들려고 한게 아닙니다.

 

그러니 권한과 도구를 많이 줘야하죠.

 

기본적으로 운영체제를 만들기 위한 언어로 만들었습니다.

 

그런데 만들고 나니까 이것만큼 좋은게 없어서 오랫동안 다방면에서 사용된 것입니다.

 

도구는 여기 쌩으로 줄테니까 알아서 프로그램을 짜라라는 취지가 있습니다.

 

현대에 와서는 이런 것을 좀 안좋게 보는 사람들도 있고 그렇습니다.

 

break 문은 자바 등 다른 언어도 많이 채택을 한 문법이라서 C언어가 특별한 건 아니지만

 

어쨋든 프로그래머는 여러가지 옵션을 가지고 있는 것입니다.

 

 

while의 사용취지 - GUI 프로그램

while 같은 경우는 for문과 비교해야 적당하죠.

 

기능적으로는 둘이 똑같이 갈 수 있는데 문법적으로는 큰 차이가 있습니다.

 

어렵게 생각되지만 while을 쓰는 경우는 루프시 조건을 판별하는 비중이 높을 때 사용합니다.

 

예를 들어 while이나 for모두 똑같이 1부터 100까지 루프할 수 있는데요.

 

while은 100이 넘어가면 멈추는거야~

 

라고 한다면

 

for는 100까지만 가~

 

이런 느낌이죠.

while은 실세계에서 상당히 많이 쓰이는 루프인데...

 

윈도우 GUI 프로그래밍에서 보통 while을 걸어놓습니다.

 

윈도우는 한번 키면 그대로 놔두는 거니까요.

 

윈도우가 꺼질 때는 사용자가 X 표시나 프로그램 종료를 클릭했을 때 뿐입니다.

 

즉 if break로 쓰는게 while 조건식을 복잡하게 쓰는 것보다 낫습니다.

 

프로그래머는 어느쪽이건 simple 한 쪽을 추구하는 거죠.

 

while 루프 - 참에 대한 관대함

 

while은 조건식이 0이 아니면 멈추지 않는다.

    int count = 1;

    while (count)
    {
        printf("count : %d\n", count);
        Sleep(100);
        count++;
    }

양수, 음수, 부동소수점 어떤 값이 들어가도 참입니다.

 

심지어 문자, 문자열도 while 조건식에서는 참입니다.

 

이런 모호함 때문에 문제를 발생시킬 수 있으니 while 안에 들어가는 조건식은 처음부터 엄격한 조건으로 설계해야합니다. (강제종료 Ctrl + C )

 

bool 형과 true / false

    bool running = true;

    while (running)

C99에서 bool 이 추가되어서 true 와 false를 사용할 수 있습니다.

 

 

과거에 bool을 만들어서 사용하던 프로그램을 위해 _Bool 을 stdbool.h에 정의해두었는데 컴파일러마다 다를 수 있습니다. 필자가 사용하는 비주얼 스튜디오에서는 bool 을 사용할 수 있는데 _Bool은 또 잘 안되는군요.

 

비주얼 스튜디오 코드를 썼는데 언어마다 IDE를 나누다 보니 C언어에 VS를 쓰고 있습니다. 비주얼 스튜디오가 C++할 때는 좋죠.

 

비주얼 스튜디오가 원래 ANSI C를 개발하기 좋은 환경이 아닙니다.

 

아래 온라인 컴파일러에서 GDB로 하면 정상적으로 _Bool을 사용할 수 있습니다.

 

GNU GCC에서 코드를 실행하는게 더 안전합니다.

 

Online C Compiler - online editor (onlinegdb.com)

 

Online C Compiler - online editor

OnlineGDB is online IDE with c compiler. Quick and easy way to compile c program online. It supports gcc compiler for c.

www.onlinegdb.com

#include <stdio.h>
#include <stdbool.h>

int main()
{
    printf("Hello World\n");
    
    _Bool run;
    
    run = true;
    
    printf("%d", run);

    return 0;
}

 

*C99에 관한 외부참조링크

 

C99 - Wikipedia

공유하기

facebook twitter kakaoTalk kakaostory naver band