시도해 보면, 나는 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
왜 브래킷이 필요하다? 조건 연산자의 결과 유형은 두 경우 모두 알려져 있습니다. 그렇지 않습니까?
참고로,'cout <<'은'cout'을 리턴하고 유효 상태에 관한 것은 아닙니다. failbit/badbit이 설정되지만'(std :: cout << (a! = 0))'은 항상'std :: cout'에 대한 참조를 반환합니다. '-42.0f'는 결코 반환되지 않아야합니다. 왜냐하면 그 참조는 항상 boolean이 true로 평가되어야하기 때문입니다. –
감사합니다. 우선 순위에 대해서 생각조차하지 않았습니다. – m47h
@SamDeHaan : 예. 미안하지만, 아마도 내 설명에 약간 거추장 스럽다. 표현 "cout << x"는 cout을 리턴합니다. 하지만 "cout? a : b"라는 표현식을 평가하려면 cout을 먼저? : 연산자에 대한 유효한 피연산자 값으로 캐스팅해야합니다. 이 경우 작업을 수행하는 것은 (operator void *)입니다. 오류 플래그가 설정된 경우 해당 연산자는 NULL을 반환합니다. 참조 : –