3. Everything is about control

앞장의 예제에서 프로그램 실행 흐름을 제어하기 위한 수단으로 함수와 for문을 배웠다. 함수는 비조건부로 제어를 넘겨준 뒤 return문으로 돌려받는다. for문은 조건부로 블록 내의 제어문을 실행한다. C에는 for를 포함해 if, for, do, while, switch 총 5개의 제어문이 존재한다. 이외의 제어 수단으로 삼항 연산자, 컴파일 타임 전처리기 조건문, 타입 제네릭 표현식 등이 있다.

3.1. Conditional execution.

첫 번째 조건문 if는 괄호 내의 제어 조건식이 참일 때 중괄호 내의 의존 블록을 실행한다. 이를 확장한 것으로 선택문 if-else문이 존재하며 이는 제어 조건식의 참/거짓 여부에 따라 두 코드 경로 중 하나를 실행한다.

Takeaway 1.3.1.1. 값 0은 논리적 거짓을 나타낸다.

Takeaway 1.3.1.2. 0이 아닌 값은 전부 논리적 참이다.

if문 내에서 0과 일치 여부를 비교할지 생략할지는 코딩 스타일에 달렸지만 정해진 법은 없다. 하지만 일반적으로:

Takeaway 1.3.1.3. 0을 참, 거짓과 비교하지 말라.

Takeaway 1.3.1.4. 모든 스칼라는 논리값이 있다.

스칼라 타입은 숫자 자료형과 포인터형을 말한다.

3.2. Iterations.

루프 시작 조건 – 루프 진행 조건 – 루프 조건 업데이트로 구성되는 for문, 루프 진행 조건 체크로 계속 진행되는 while문, 최소 한번의 진행을 보장한 뒤 진행 조건 체크로 계속 진행되는 do-while문이 있다. break문은 반복 실행을 빠져나가고, continue는 실행부분의 처음으로 되돌아간다.

다음의 예는 반복문을 적절히 활용한 헤론 근사의 예를 보여준다.

#include <stdlib.h>
#include <stdio.h>

/* lower and upper iteration limits centered around 1.0 */
static double const eps1m01 = 1.0 - 0x1P-01;
static double const eps1p01 = 1.0 + 0x1P-01;
static double const eps1m24 = 1.0 - 0x1P-24;
static double const eps1p24 = 1.0 + 0x1P-24;

int main(int argc, char* argv[argc+1]) {
  for (int i = 1; i < argc; ++i) {        // process args
    double const a = strtod(argv[i], 0);  // arg -> double
    double x = 1.0;
    for (;;) {                    // by powers of 2
      double prod = a*x;
      if (prod < eps1m01) {
        x *= 2.0;
      } else if   (eps1p01 < prod) {
        x *= 0.5;
      } else {
        break;
      }
    }
    for (;;) {                    // Heron approximation
      double prod = a*x;
      if ((prod < eps1m24) || (eps1p24 < prod)) {
        x *= (2.0 - prod);
      } else {
        break;
      }
    }
    printf("heron: a=%.5e,\tx=%.5e,\ta*x=%.12f\n",
           a, x, a*x);
  }
  return EXIT_SUCCESS;
}

3.3. Multiple selection.

선택문으로 switch-case문이 있다. if-else if문과 비슷하게 쓰인다. 잔여 케이스는 case: 라벨이 아닌 default: 라벨을 쓰며, 각각의 case문은 break를 걸지 않으면 다음 점프 대상인 case문으로 진행한다.

Takeaway 1.3.3.1. case 값은 반드시 정수형 상수 표현식이어야 한다.

Takeaway 1.3.3.2. case 라벨은 변수 정의문을 건너뛰면 안 된다.

요점 정리

  • 수치적 값들은 if 문의 조건으로 쓰일 수 있다. 0은 거짓이고, 그 외의 값은 참이다.
  • 3개의 서로 다른 조건문으로 for, do, while이 존재한다. for가 가장 선호된다.
  • switch 문은 다중 선택을 수행한다. 하나의 case문은, break문으로 중단되지 않았을 경우 다음 case문으로 진행한다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중