Техника тестирования на истинность или ложь определенно является плохой практикой, если рассматриваемая переменная действительно предполагается использовать как логическое значение (даже если ее тип не является логическим) - особенно в 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
Если вы чувствуете необходимость протестировать переменную, которая используется в качестве логического флага против истины / ложь (что, на мой взгляд, делать не следует), вы должны использовать идиому всегда проверять на ложь, потому что ложь может иметь только одно значение (0
), в то время как истина может иметь несколько возможных значений (все, кроме 0
):
if (isGood != false) ... // instead of using if (isGood == true)
Некоторые люди будут думать, что это недостаток C / C ++, и это может быть правдой. Но это факт жизни для этих языков (и, вероятно, многих других), поэтому я бы придерживался короткой идиомы, даже в таких языках, как C #, которые не позволяют использовать целое значение в качестве логического.
См. Этот вопрос SO, чтобы увидеть, где эта проблема на самом деле кого-то укусила ...
person
Community
schedule
10.12.2008