2016-10-03 3 views
0

Я пытаюсь сравнить две целые переменные с одной и той же константой. По-видимому, в этом случае обе переменные имеют одинаковые значения по умолчанию. Я попытался упростить сравнение, например:Оператор C if, сравнивающий две целые переменные с одной и той же константой

if (po->app_tag == po->inst_id == 0) 
    return 1; 

Это не сработало.

я должен был кодировать это нравится:

if ((po->app_tag == 0) && (po->inst_id == 0)) 
    return 1; 

Чтобы заставить его работать. Может ли кто-нибудь объяснить мне разницу между ними? Каким-то образом я считаю, что компилятор C должен иметь условие для такого синтаксиса, когда речь идет о сравнении двух целых переменных. Я могу ошибаться, прося об этом .. :), но хочу понять причину .. Почему я здесь не прав.

+1

Знаете ли вы, какие значения может возвращать выражение 'a == b'? –

+0

Когда вы сравниваете переменную с результатом другого сравнения, вы сравниваете ее с 0 или 1, что скорее всего не то, что вы хотите: http://stackoverflow.com/questions/18097922/return-value-of- оператор-в-c –

+0

@EugeneSh. да .. сделал основную ошибку ... –

ответ

3

Благодаря ассоциативности == оператора (он ассоциирует слева направо),

po->app_tag == po->inst_id == 0 

интерпретируется как:

(po->app_tag == po->inst_id) == 0 

Вот как определяется язык.

Использование

(po->app_tag == 0) && (po->inst_id == 0) 

исправляет эту проблему путем оценки po->app_tag == 0 и po->inst_id == 0 независимо друг от друга и выполняют логическое И между этими двумя.

Для получения дополнительной информации о приоритете и ассоциативности операторов см. http://en.cppreference.com/w/c/language/operator_precedence.

+0

Спасибо за подробное объяснение .. !! –

1

po->app_tag == po->inst_id == 0 будет интерпретироваться как (po->app_tag == po->inst_id) == 0 - то есть, то, что в настоящее время по сравнению с 0 не являются две переменные по отдельности, но результат po->app_tag == po->inst_id. Эта операция вернет 1, если эти два значения равны, и 0, если они не являются. В сущности, тогда po->app_tag == po->inst_id == 0 эквивалентен po->app_tag != po->inst_id, который вам не нужен.

+0

Спасибо за подробное объяснение .. !! –

0

Это способ работы компилятора C/C++. Выражение сравнения может сравнивать только две переменные. Если вы хотите больше этого, вам нужно будет использовать логическое выражение AND (&&) или OR (||). Если вы хотите сравнить переменную с более чем двумя значениями const, вы можете использовать оператор switch.

Смежные вопросы