4.4 삼항 연산자와 조건 연산자

    삼항 연산자(ternary operator)if문처럼 두 가지 갈래 중 조건에 맞는 것을 골라서 리턴하는 표현식이다.

    size_t size_min(size_t a, size_t b) {
      return (a < b) ? a : b;
    }

    &&|| 연산자와 마찬가지로 두 번째와 세 번째 피연산자는 꼭 필요할 때만 평가된다. tgmath.h 헤더 파일에 정의된 sqrt 매크로는 음이 아닌 값의 제곱근을 계산한다. 이 매크로에 음수를 지정해서 호출하면 도메인 에러(domain error)C가 발생한다.

    #include <tgmath.h>
    
    #ifdef __STDC_NO_COMPLEX__
    # error "we need complex arithmetic"
    #endif
    
    double complex sqrt_real(double x) {
      return (x < 0) ? CMPLX(0, sqrt(-x)) : CMPLX(sqrt(x), 0);
    }

    이 함수에서 sqrt는 단 한 번만 호출되며, 인수는 절대 음수가 되지 않는다. 따라서 sqrt_real에서 오류가 발생할 일이 없다. sqrt에 잘못된 값이 전달될 일이 없기 때문이다.

    복잡한 산술 연산을 수행하거나 그런 연산이 많을 때는 complex.h 헤더 파일을 사용해야 한다. tgmath.h에서는 이 헤더 파일을 직접 인클루드한다. 이에 대해서는 5.7.7절에서 자세히 소개한다.

    앞의 예제는 전처리기 지시자(preprocessor directive)C를 사용하여 조건부 컴파일을 지정했다. #ifdef 구문은 _ _STDC_NO_COMPLEX_ _ 매크로가 정의된 경우에만 #error 조건이 적용되도록 설정한다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.