2017-01-18 3 views
1

Почему true==151 считается небезопасной операцией, в то время как true==true, который фактически имеет такое же выражение, нет. Более того, почему true==151 никогда не будет правдой, в отличие от true&&151?Какова мотивация для предупреждения компилятора C4806 (номер == bool value)?

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' повышен до типа 'Int' может равняться заданной постоянной

+1

Это хорошая идея, чтобы включить все сообщение, а не только его код. Верьте или нет, но многие из нас не передали все коды ошибок Microsoft в память. – molbdnilo

+0

Различные типы. Действительно ли желтый? – ZDF

+0

@ZDF Есть ли у истины цвет? – molbdnilo

ответ

5

First давайте ответим на ваш второй вопрос: true==151 всегда false, потому что true определено как значение 1.

В целом, если вы интерпретируете числовое значение как логическое значение, 0 будет ложным, а все остальное будет истинным; но буква true должна иметь определенное значение, и это значение равно 1.

Так зачем же предупреждать о ==, где операнды - это bool и целое число? Ну, во-первых, потому что 151==true, если вы его заметили, похоже, что это должно быть правдой (потому что 151 является «истинным» значением), но, как отмечено выше, это не так. Это вероятный источник ошибок, поэтому он заслуживает предупреждения. В более общем плане вы прямо сравниваете два разных типа, где неявное преобразование может быть не очевидным/может иметь неочевидные последствия.

+0

С другой стороны, я мог представить себе ситуацию, когда переписывание ее как «true == bool (151)» может быть как минимум допустимым кодом (особенно если вы замените «151» на переменную), но даже тогда это, вероятно, знак что что-то можно сделать более чисто ... – twalberg

+0

'bool' может быть только« true »или' false', ничего другого, кроме вызова неопределенного поведения. – lcs

+0

Да ... к лучшему или худшему это путаница в использовании языка с гибким применением булевых операторов и введением в него типа 'bool'. 'if (151)' отлично определен, несмотря на наблюдение @ Ics, и его интерпретация разъясняет, что 151 является логически истинным значением ... –

 Смежные вопросы

  • Нет связанных вопросов^_^