Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 조건부 삼항 연산자(?:) 완벽 정리 – 동작 원리와 사용 예제

C++의 조건부 연산자(? :)는 세 개의 피연산자를 필요로 하는 삼항 연산자입니다. if-else 문을 한 줄로 간결하게 표현할 수 있어 실무에서 널리 활용됩니다.

조건부 연산자의 동작 방식

  • 첫 번째 피연산자는 암묵적으로 bool 타입으로 변환됩니다. 평가가 이루어지며, 모든 부수 효과(side effect)는 다음 단계로 진행되기 전에 완료됩니다.
  • 첫 번째 피연산자가 true(1)로 평가되면 두 번째 피연산자가 평가됩니다.
  • 첫 번째 피연산자가 false(0)로 평가되면 세 번째 피연산자가 평가됩니다.

조건부 연산자의 결과값은 실제로 평가된 피연산자, 즉 두 번째 또는 세 번째 피연산자의 값이 됩니다. 조건식에서는 마지막 두 피연산자 중 오직 하나만 평가된다는 점에 유의하세요.

평가 규칙과 주의사항

조건부 연산자의 평가 과정은 생각보다 복잡합니다. 위의 설명은 기본적인 개요일 뿐이며, 조건식은 오른쪽에서 왼쪽으로 결합(right-to-left associativity)됩니다. 첫 번째 피연산자는 반드시 정수형(integral type) 또는 포인터 타입이어야 합니다.

두 번째와 세 번째 피연산자에는 다음 규칙들이 적용됩니다.

  • 두 피연산자가 같은 타입이면 결과도 해당 타입이 됩니다.
  • 두 피연산자가 산술(arithmetic) 또는 열거형(enum) 타입이면, 일반적인 산술 변환(Standard Conversions 문서 참조)을 통해 공통 타입으로 변환됩니다.
  • 두 피연산자가 모두 포인터 타입이거나, 하나는 포인터 타입이고 다른 하나는 0으로 평가되는 상수 표현식인 경우, 포인터 변환을 통해 공통 타입으로 변환됩니다.
  • 두 피연산자가 모두 참조(reference) 타입이면 참조 변환을 통해 공통 타입으로 변환됩니다.
  • 두 피연산자가 모두 void 타입이면 공통 타입은 void가 됩니다.
  • 두 피연산자가 동일한 사용자 정의 타입(user-defined type)이면 공통 타입은 해당 타입이 됩니다.
  • 피연산자들의 타입이 서로 다르고 최소 하나 이상이 사용자 정의 타입이라면, 언어 규칙에 따라 공통 타입이 결정됩니다.

예제 코드

다음 예제는 조건부 연산자를 사용해 두 수 중 큰 값을 출력하는 프로그램입니다.

#include <iostream>
using namespace std;

int main() {
    int i = 1, j = 2;
    cout << ( i > j ? i : j ) << " is greater." << endl;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.

2 is greater.

i(1)가 j(2)보다 크지 않으므로 조건식은 false로 평가되고, 세 번째 피연산자인 j의 값인 2가 결과로 출력됩니다. 이처럼 조건부 삼항 연산자를 활용하면 간단한 분기 로직을 짧고 읽기 쉽게 작성할 수 있습니다.