Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Необычная конструкция if в C/С++

#c #c++


Сегодня увидел странную конструкцию if в коде:
#define ERROR_OK 0L

int foo();

// ...
if (ERROR_OK == foo() != ERROR_OK) 
{
    // ...
}
else
{
    // ...
}

Так до конца и не понял, почему этот код работает и при каких значения функция выполняется.
Понял, что если foo() вернет 0, то будет выполнена ветка внутри if. Помогите полностью
разобраться.    


Ответы

Ответ 1



Ну, всё довольно просто. Давайте разбирать по кускам. 1) Выполняется сравнение ERROR_OK == foo(). Оно вернёт true или false, в зависимости от значения ERROR_OK и того, что вернёт функция. 2) Результат предыдущего вычисления (т.е. true или false) сравнивается с ERROR_OK. При этом то самое true или false приведётся к int (true -> 1, false -> 0). Ну и обычное сравнение. Соответственно, если считать, что ERROR_OK = 0 (а в условии написано именно так), то первая часть условия эквивалентна 0 == foo(), т.е. !foo(). Вторая часть условия эквивалентна !foo() != 0, т.е. foo() == 0, т.е. просто !foo(). Значит, если foo вернёт 0, то условие выполнится, а иначе — нет.

Ответ 2



Код эквивалентен !foo(). Синтаксис странный, но корректный.

Ответ 3



Значение условного выражения в секции if будет истинным всегда, когда функция foo() будет возвращать 0, независимо от того, чему равен ERROR_OK.

Ответ 4



Необычного и странного в конструкции ничего нет! Чтобы не путаться, есть простое правило: выражение в скобках может возвращать либо true либо false. Если выражение даёт true, то выполняется то, что находится сразу после закрывающейся круглой скобки. А само выражение в скобках разбирается согласно утверждённому приоритету операторов.

Комментариев нет:

Отправить комментарий