Действительно ли сравнение является BOOL против ДА опасного?

Я нашел комментарий сегодня в исходном файле:

//  - no longer compare BOOL against YES (dangerous!)

Выдерживает сравнение BOOL против YES в Objective C, действительно настолько опасном? И почему это?

Может значение YES изменение во время времени выполнения? Возможно, NO всегда 0 но YES может быть 1, 2 или 3 - в зависимости от времени выполнения, компилятора, Ваших связанных платформ?

7
задан Josh Caswell 16 July 2014 в 03:46
поделиться

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
}
17
ответ дан 6 December 2019 в 06:03
поделиться

Вы никогда не должны сравнивать логические значения с чем-либо на любом из языков, основанных на 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 - ложь,

11
ответ дан 6 December 2019 в 06:03
поделиться

Когда в коде используется BOOL переменная, предполагается использовать такую ​​переменную как логическую. Компилятор не проверяет, получает ли переменная BOOL другое значение, точно так же, как компилятор не проверяет, инициализируете ли вы переменную, переданную в метод, значением, взятым между набором констант.

0
ответ дан 6 December 2019 в 06:03
поделиться