Вы никогда не должны сравнивать логические значения с что-либо ни на одном из языков на основе Си. Правильный способ сделать это - использовать:
if (b)
или
if (!b)
Это делает ваш код намного более читабельным (особенно если вы используете интеллектуально названные переменные и функции, такие как isPrime(n)
или childThreadHasFinished
) и безопасный. Причина что-то вроде:
if (b == TRUE)
не настолько безопасен, так как на самом деле существует большое количество значений b
, которые оценятся в true, и TRUE
является только одним из них.
Примите во внимание следующее:
#define FALSE 0
#define TRUE 1
int flag = 7;
if (flag) printf ("number 1\n");
if (flag == TRUE) printf ("number 2\n");
Вы должны вывести обе эти строки распечатаны, если они работают, как ожидалось, но вы получите только первую. Это потому, что 7 на самом деле истинно, если обрабатывается правильно (0 ложно, все остальное верно), но явный тест на равенство оценивается как ложное.
Обновление:
В ответ на ваш комментарий о том, что вы подумали, что в этом есть что-то большее, чем глупость кодера: да, есть (но я все равно не стал бы считать глупость кодера достаточной причиной - защитное программирование всегда хорошая идея) .
Я также упомянул читабельность, которая довольно высока в моем списке желаемых функций в коде.
A условие должно быть либо сравнением объектов, либо флагом (включая логические возвращаемые значения):
if (a == b) ...
if (c > d) ...
if (strcmp (e, "Urk") == 0) ...
if (isFinished) ...
if (userPressedEsc (ch)) ...
Если вы используете (что я считаю) мерзость вроде:
if (isFinished == TRUE) ...
где вы останавливаетесь:
if (isFinished == TRUE) ...
if ((isFinished == TRUE) == TRUE) ...
if (((isFinished == TRUE) == TRUE) == TRUE) ...
и т. Д.
Правильный способ сделать это для удобочитаемости - просто использовать переменные флагов с соответствующими именами.