저는 현재 C ++ Primer 책으로 C ++를 배우고 있으며이 책의 연습 중 하나는 다음과 같습니다.
다음 표현이 무엇을하는지 설명하십시오.
someValue ? ++x, ++y : --x, --y
우리는 무엇을 압니까? 삼항 연산자가 쉼표 연산자보다 우선 순위가 높다는 것을 알고 있습니다. 이항 연산자를 사용하면 이해하기 쉬웠지만 삼항 연산자를 사용하면 약간 어려움을 겪고 있습니다. 이항 연산자를 사용하면 "더 높은 우선 순위를 갖는다"는 것은 우리가 더 높은 우선 순위로 표현식 주위에 괄호를 사용할 수 있으며 실행을 변경하지 않을 것임을 의미합니다.
삼항 연산자의 경우 다음을 수행합니다.
(someValue ? ++x, ++y : --x, --y)
컴파일러가 코드를 그룹화하는 방법을 이해하는 데 도움이되지 않는 동일한 코드를 효과적으로 생성합니다.
그러나 C ++ 컴파일러를 사용한 테스트를 통해 표현식이 컴파일된다는 것을 알고 있으며 :
연산자가 그 자체로 무엇을 의미 할 수 있는지 알 수 없습니다 . 따라서 컴파일러는 삼항 연산자를 올바르게 해석하는 것 같습니다.
그런 다음 두 가지 방법으로 프로그램을 실행했습니다.
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
결과 :
11 10
반면에 다음과 someValue = false
같이 인쇄됩니다.
9 9
왜 C ++ 컴파일러는 삼항 연산자의 참 분기에 대해 증가하는 코드를 생성하고 삼항 x
의 거짓 분기에 대해 x
및 둘 다 감소시키는 이유는 y
무엇입니까?
나는 심지어 다음과 같이 진정한 가지 주위에 괄호를두기까지했다.
someValue ? (++x, ++y) : --x, --y;
그러나 여전히 11 10
.
?
은 조건부 연산자 입니다. 삼항 연산자 라는 용어는 단순히 세 개의 피연산자가있는 연산자를 의미합니다. 조건부 연산자는 삼항 연산자 의 한 예 이지만 언어는 (이론적으로) 여러 삼항 연산자를 가질 수 있습니다.