3. Control Flow

제어 흐름에 대해 알아보자.

3.1. Statements and Blocks

표현식은 ;가 붙으면 명령문이 된다. 여러 명령문을 { }로 감쌀 수 있다.

3.2. If-Else

if-else 문은 결정을 표현할 때 쓴다. if (expr)은 if (expr != 0)과 같다. else는 직전 if와 연결된다. 괄호를 이용해 이를 명확히 할 수 있다. 이 때 if나 else 아래의 문도 ;를 붙여줘야 한다.

3.3. Else-If

else if 문은 여러 방향 결정을 나타낼 때 쓴다. 마지막 else 문은 나머지 경우를 다룬다. 이진 탐색으로 예를 들어보자. 코드는 다음과 같다.

int binsearch(int x, int v[], int n) {
    int low = 0, high = n - 1;
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (x < v[mid]) {
            high = mid - 1;
        } else if (x > v[mid]) {
            low = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}

3.4. Switch

switch문도 여러 방향 결정을 테스트할 때 쓰인다. if와 else if로 조합한 프로그램의 대안이 될 수 있다. break문은 switch로부터 즉시 빠져나간다. 다음 케이스로 실행이 멈추지 않고 계속되는 것은 잘 활용해야 한다. 웬만하면 모든 케이스에 break;을 써 주자. 의도적인 계속된 실해이라면 [[fallthrough]]을 붙여 주자.

3.5. Loops-While and For

while문, for문은 이미 알아보았다. for문은 while문으로 동치시킬 수 있다. for문의 세 부분은 표현식이다. 무엇을 쓸지는 선호의 문제이다. atoi를 for문으로 바꿔서 짜 보자. 표준 라이브러리에는 strtol이 있다. 반복문 제어를 중앙화하는 것은 여러 반복문이 중첩되었을 때 도움이 된다. 콤마 연산자도 존재한다. 이는 가급적 쓰지 말라.

3.6. Loops-Do-while

do-while문도 있다. 이는 do 내의 블록을 한 번 수행한 뒤 while 조건이 만족되는 한 계속 수행한다. 이는 while이나 for보다 훨씬 덜 쓰인다. 이는 가끔 유용하다.

3.7. Break and Continue

루프를 빠져나올 때는 break을 쓴다. 루프 내 다른 부분을 실행하지 않고 루프를 계속할 때는 continue를 쓴다. strlen이 그 예가 될 수 있다. 여기서는 continue와 break를 쓴다. 남용하지는 말라.

3.8. Goto and Labels

C는 goto 문도 지원한다. goto 문이 적절할 경우도 있다. 이 때 goto label:은 특정 라벨로 바로 점프한다. goto로 쓰여진 코드는 항상 goto 없이 쓰일 수 있다. 여러 예에서도 마찬가지다. 가급적이면 쓰지 말라.