2012-03-08 2 views
7

시도해 보면, 나는 cout 문에서 조건 연산자를 대괄호로 묶어야한다는 것을 알게되었다. 여기에 작은 예 :조건부 연산자가 cout 문에 사용됨

#include <iostream> 

int main() { 
    int a = 5; 
    float b = (a!=0) ? 42.0f : -42.0f; 
    // works fine 
    std::cout << b << std::endl; 
    // works also fine 
    std::cout << ((a != 0) ? 42.0f : -42.0f) << std::endl; 
    // does not work fine 
    std::cout << (a != 0) ? 42.0f : -42.0f; 

    return 0; 
} 

출력은 다음과 같습니다

42 
42 
1 

왜 브래킷이 필요하다? 조건 연산자의 결과 유형은 두 경우 모두 알려져 있습니다. 그렇지 않습니까?

답변

13

?: 연산자는 << 연산자보다 우선 순위가 낮습니다. 즉, 컴파일러는 마지막 문장을 해석 등 : 첫째 (a!=0)의 부울 값이를 법원에 스트리밍합니다

(std::cout << (a != 0)) ? 42.0f : -42.0f; 

. 그 표현식의 결과 (즉, cout에 대한 참조)는? : 연산자 (즉, void* : http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/ 참조)에서 사용할 적절한 유형으로 캐스팅되고 해당 값이 true인지 여부에 따라 오류 플래그는 설정되지 않음), 값 42 또는 값 -42를 가져옵니다. 마지막으로, 그 값을 버릴 것입니다 (아무 것도 사용하지 않기 때문에).

+0

참고로,'cout <<'은'cout'을 리턴하고 유효 상태에 관한 것은 아닙니다. failbit/badbit이 설정되지만'(std :: cout << (a! = 0))'은 항상'std :: cout'에 대한 참조를 반환합니다. '-42.0f'는 결코 반환되지 않아야합니다. 왜냐하면 그 참조는 항상 boolean이 true로 평가되어야하기 때문입니다. –

+0

감사합니다. 우선 순위에 대해서 생각조차하지 않았습니다. – m47h

+1

@SamDeHaan : 예. 미안하지만, 아마도 내 설명에 약간 거추장 스럽다. 표현 "cout << x"는 cout을 리턴합니다. 하지만 "cout? a : b"라는 표현식을 평가하려면 cout을 먼저? : 연산자에 대한 유효한 피연산자 값으로 캐스팅해야합니다. 이 경우 작업을 수행하는 것은 (operator void *)입니다. 오류 플래그가 설정된 경우 해당 연산자는 NULL을 반환합니다. 참조 :

4

<<?보다 우선합니다.

재미있는 운동 :

float ftest = std::cout << (a != 0) ? 42.0f : -42.0f; 

이 코딩 호러, 가져가!

에 코드가 동등하다 :

if (std::cout << (a != 0)) 
    42.0f; 
else 
    -42.0f; 

그것은 1 출력 인해 잘 (a != 0) == true;