C++ 생각보다 많이 모르는 삼항 연산자의 특성

프로그래밍/C++ 2019.11.06 댓글 Plorence

https://docs.microsoft.com/ko-kr/cpp/cpp/conditional-operator-q?view=vs-2019

해당 문서만 봐도 해당 게시글에서 설명하는 것은 다봤다고 해도 무방합니다.

exp1 ? exp2 : exp3;

라는 삼항 연산자가 있을 때..

 

exp2과 exp3의 타입이 동일하다면 lvalue이다.

당연히 exp2와 exp3도 lvalue일때를 말합니다.

char A = 'a';
char B = 'A';
(1 ? A : B) = 'B';

C는 컴파일 에러가 발생하고 C++에서는 이것이 허용됩니다.

 

exp2과 exp3의 타입이 다르다면 형 변환이 일어난다.

제가 삼항 연산자를 더 알아본 이유입니다.

#include <iostream>
int main(void) {
       char Result = 'A';
       std::cout << (1? Result : int(Result));
}

해당 코드에서 의도되지 않은 문제가 있었는데, 삼항연산자가 참이어도 정수로 출력되는 것입니다.

왜그러냐면 char, int가 되므로 변환이 일어나면서 조건이 참이든 거짓이든 결과값은 int가 됩니다.

 

만약 서로 동일한 타입을 가질 수 없는 경우에는 컴파일 에러가 발생합니다.

#include <iostream>
class A
{
};
class B {
};
int main(void) {
       A a;
       B b;
       A C = (1 ? a : b);
}

댓글