2017-01-18 8 views
1

true==151이 안전하지 않은 작업으로 간주되는 이유는 무엇입니까? true==true은 사실상 동일한 표현식을 사용하지만 그렇지 않습니다. 또한 true&&151과 달리 true==151이 사실이 될 수없는 이유는 무엇입니까?컴파일러 경고 C4806의 동기는 무엇입니까 (숫자 == bool 값)?

cout<<(true==151);  //0 and it gives compiler warning C4806 
cout<<(true==true);  //1 no warning 
if(true==151)cout<<"1"; //"0" and warning again 
if(true&&151)cout<<"1"; //1 no warning 
if(151)cout<<"1";  //1 

경고 C4806 자체

'=='안전 동작 : 된 타입의 값이 'BOOL'주어진 상수

+1

코드뿐만 아니라 전체 메시지를 포함하는 것이 좋습니다. 믿거 나 말거나, 그러나 우리 중 많은 사람들이 모든 Microsoft의 오류 코드를 메모리에 맡기지 않았습니다. – molbdnilo

+0

다른 유형. 진실한 노란색인가? – ZDF

+0

@ZDF 진실에는 색깔이 있습니까? – molbdnilo

답변

5

우선 같을 수 '내부'를 입력 승격 두 번째 질문에 대답 해 봅시다 : true1으로 정의 되었기 때문에 true==151은 항상 거짓입니다.

일반적으로 숫자 값을 부울로 해석하면 0은 거짓이고 다른 것은 참입니다. 리터럴 true은 특정 값을 가져야하고 그 값은 1입니다.

따라서 == 피연산자가 부울 및 정수인 이유는 무엇입니까? 글쎄, 우선 151==true이기 때문에, 당신이 안구를 낀다면 (사실 151이 "true"값이기 때문에) 진실해야만하는 것처럼 보입니다. 그러나 위에서 언급했듯이 그렇지 않습니다. 이는 오류의 원인 일 가능성이 높기 때문에 경고의 의미가 있습니다. 더 일반적으로 암시 적 변환이 명확하지 않을 수도 있고 명백하지 않은 결과를 낼 수도있는 두 가지 유형을 직접 비교하고 있습니다.

+0

반면에,'true == bool (151)'을 적어도 유효한 코드로 (특히'151'을 변수로 바꾸면) 코드로 기록하는 것이 상상 될 수 있습니다. 뭔가 더 깨끗하게 처리 될 수 있습니다. – twalberg

+0

'bool'은'true' 또는'false' 일 수 있습니다. 정의되지 않은 동작을 호출하지 않고는 아무것도 할 수 없습니다. – lcs

+0

예 ... 더 좋든 나 나쁘 든 이것은 부울 연산자의 유연한 응용 프로그램과 함께 언어를 가져 와서 그 안에 'bool' 유형을 고수하는 혼란입니다. @Ics의 관찰에도 불구하고'if (151)'가 완벽하게 잘 정의되어 있으며, 그 해석은 151이 논리적으로 참인 값이라는 것을 분명히합니다 ... –