2017-01-18 12 views
1

は、実質的に同じ表現を保持していますが、true==151は安全でない操作とみなされるのはなぜですか。また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自体

'==':安全でない操作:タイプのない値 'ブール' ある一定

+1

メッセージだけでなく、メッセージ全体を含めることをお勧めします。それを信じるかどうかはわかりませんが、私たちの多くは、Microsoftのすべてのエラーコードをメモリにコミットしていません。 – molbdnilo

+0

異なるタイプ。本当の黄色ですか? – ZDF

+0

@ZDF真実は色を持っていますか? – molbdnilo

答えて

5

最初に等しくすることができる 'INT' を入力するために昇格あなたの2番目の質問に答えましょう:trueが値1を持つように定義されているので、true==151は常に偽です。

一般的に、数値をブール値として解釈する場合は0が偽になり、それ以外の場合は真になります。リテラルtrueは特定の値を持っていなければならず、その値は1です。

なぜ、オペランドがboolと整数であるのかを警告するのはなぜですか?==まず、151==trueのように、眼球に当てはまると(151が「真の」値なので)真実でなければならないようですが、上記のようにそうではありません。それはエラーの原因の可能性が高いので、警告が必要です。より一般的には、暗黙的な変換が明白でないかもしれない/明らかでない結果をもたらすかもしれない2つの異なるタイプを直接比較しています。

+0

一方、 'true == bool(151)'を少なくとも有効なコード(特に '151'を変数に置き換えた場合)として記録することは想像できますが、それでもおそらく記号ですより明瞭に何かを行うことができます... – twalberg

+0

'bool'は' true'または 'false'のみであり、未定義の動作を呼び出さずには何もありません。 – lcs

+0

はい...いいですか悪い場合は、これはブール演算子の柔軟なアプリケーションで言語を取り、その中に 'bool'型を張っているという混乱です。 @Icsの観察にもかかわらず、if(151)が完全に明確に定義されており、その解釈により、151が論理的に真の値であることが明らかになった... –

関連する問題