Я нашел комментарий сегодня в исходном файле:
// - no longer compare BOOL against YES (dangerous!)
Выдерживает сравнение BOOL
против YES
в Objective C, действительно настолько опасном? И почему это?
Может значение YES
изменение во время времени выполнения? Возможно, NO
всегда 0
но YES
может быть 1
, 2
или 3
- в зависимости от времени выполнения, компилятора, Ваших связанных платформ?
Проблема в том, что BOOL - это не собственный тип, а определение типа:
typedef signed char BOOL;
#define YES (BOOL)1
#define NO (BOOL)0
Как символ, его значения не ограничиваются TRUE
и ЛОЖЬ
. Что произойдет с другим значением?
BOOL b = 42;
if (b)
{
// true
}
if (b != YES)
{
// also true
}
Вы никогда не должны сравнивать логические значения с чем-либо на любом из языков, основанных на C. Правильный способ сделать это - использовать:
if (b)
или:
if (!b)
. Это сделает ваш код более читабельным (особенно если вы используете интеллектуально названные переменные и функции, такие как isPrime (n)
или childThreadHasFinished
) и безопасно. Причина, по которой что-то вроде:
if (b == TRUE)
не так безопасно, состоит в том, что на самом деле существует большое количество значений b
, которые будут оцениваться как истинные, и ИСТИНА
- только одно из них.
Примите во внимание следующее:
#define FALSE 0
#define TRUE 1
int flag = 7;
if (flag) printf ("number 1\n");
if (flag == TRUE) printf ("number 2\n");
Вы должны получить обе эти строки, если все работает должным образом, но вы получите только первую. Это потому, что 7 на самом деле истинно при правильном обращении (0 - ложь,
Когда в коде используется BOOL
переменная, предполагается использовать такую переменную как логическую. Компилятор не проверяет, получает ли переменная BOOL
другое значение, точно так же, как компилятор не проверяет, инициализируете ли вы переменную, переданную в метод, значением, взятым между набором констант.