#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, то выполняется то, что находится сразу после закрывающейся круглой скобки. А само выражение в скобках разбирается согласно утверждённому приоритету операторов.
Комментариев нет:
Отправить комментарий