Техника тестирования специально против true или false определенно является плохой практикой, если рассматриваемая переменная действительно должна использоваться как логическое значение (даже если ее тип не является логическим), особенно в C / C ++. Тестирование на true
может (и, вероятно, приведет) к тонким ошибкам:
Эти явно похожие тесты дают противоположные результаты:
// needs C++ to get true/false keywords
// or needs macros (or something) defining true/false appropriately
int main( int argc, char* argv[])
{
int isGood = -1;
if (isGood == true) {
printf( "isGood == true\n");
}
else {
printf( "isGood != true\n");
}
if (isGood) {
printf( "isGood is true\n");
}
else {
printf( "isGood is not true\n");
}
return 0;
}
Отображает следующий результат:
isGood != true
isGood is true
Если вы чувствуете необходимость проверить переменную, которая используется в качестве логического флага, против true / false (что, по моему мнению, не следует делать), вы должны использовать идиому всегда проверять против false, потому что false может иметь только значение (0
), в то время как истина может иметь несколько возможных значений (что угодно, кроме 0
):
if (isGood != false) ... // instead of using if (isGood == true)
Некоторые люди будут считать, что это недостаток C / C ++, и это может быть правдой. Но это факт жизни в этих языках (и, вероятно, во многих других), поэтому я хотел бы придерживаться краткой идиомы, даже в таких языках, как C #, которые не позволяют использовать интегральное значение в качестве логического значения.
См. Этот вопрос ТАК для примера, где эта проблема действительно кого-то укусила ...