Оператор C if, сравнивающий две целочисленные переменные с одной и той же константой

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

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

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

Мне пришлось закодировать это так:

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

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


person Chintan Shah    schedule 03.10.2016    source источник
comment
Знаете ли вы, какие значения может возвращать выражение a == b?   -  person Eugene Sh.    schedule 03.10.2016
comment
Когда вы сравниваете переменную с результатом другого сравнения, вы сравниваете ее либо с 0, либо с 1, что, скорее всего, не то, что вам нужно: stackoverflow.com/questions/18097922/   -  person Random Davis    schedule 03.10.2016
comment
@ЕвгенийШ. да.. допустил основную ошибку...   -  person Chintan Shah    schedule 06.12.2017
comment
@ChintanShah Вау... ты быстро отвечаешь...   -  person Eugene Sh.    schedule 06.12.2017
comment
На этот раз даже быстрее.. :P   -  person Chintan Shah    schedule 03.01.2018


Ответы (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 для получения дополнительной информации о приоритете операторов и ассоциативности.

person R Sahu    schedule 03.10.2016
comment
Спасибо за подробное объяснение..!! - person Chintan Shah; 03.10.2016

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, а это не то, что вы хотели.

person R_Kapp    schedule 03.10.2016
comment
Спасибо за подробное объяснение..!! - person Chintan Shah; 03.10.2016

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

person PazO    schedule 03.10.2016