В моем примере я создаю целочисленную переменную с именем testVar и присваиваю ей значение A1 в шестнадцатеричном формате. При распечатке переменной видно, что она действительно должна быть равна A1 в шестнадцатеричном формате. Теперь при проверке того, равен ли testVar A1 в операторе if, оператор if выполняется только тогда, когда к переменной не применяется никакая маска.
Почему эти операторы if не выполняются, когда к переменной применена маска?
#include <stdio.h>
int testVar = 0xA1; // testVar should be equal 0x000000A1 now
void main() {
printf("%x \n", testVar); // Should prove that testVar is indeed equal to A1 in hexadecimal
printf("%x \n", testVar & 0x000000FF); // Both printf functions are outputting a1
if (testVar == 0x000000A1) { // This 'if' statement works!
printf("success1");
}
if (testVar & 0x000000FF == 0x000000A1) { // This doesn't execute
printf("success2");
}
if (testVar & 0x000000FF == 0xA1) { // This doesn't execute
printf("success3");
}
}
Нет предупреждения компилятора? MSVC дает это без стены
gcc и clang выдадут предупреждение при компиляции с -Wall.
Кстати: где вы научились использовать void main() { ... }?
Для этого должно быть множество дубликатов. Это добавляет ненужную избыточность.
продолжение' - Где канонический вопрос?
Вопрос «почему» (на самом деле не дубликат): Приоритет оператора (побитовый '&' ниже, чем '=='). «Почему побитовые операторы (& и |) имеют более низкий приоритет, чем оператор равенства (==)?»
Отправная точка (дубликат с низкой оценкой): Почему побитовые операторы требуют скобок? (2017)
Где канонический вопрос?
Находится между логическими операторами И и ИЛИ (не дубликаты и не побитовые операторы): Бинарные операторы C++ в порядке приоритета (2008)
Другие наборы операторов (не дубликаты): Приоритет операторов C++ "&" и "->" и Приоритет операторов C++
Остается вопрос: где же канонический вопрос?





Оператор равенства == имеет более высокий приоритет, чем двоичный побитовый оператор И &. Это означает, что это:
if (testVar & 0x000000ff == 0x000000a1)
Разбирает так:
if (testVar & (0x000000ff == 0x000000a1))
Это не то, чего вы хотите. Используйте круглые скобки, чтобы обеспечить правильную группировку:
if ((testVar & 0x000000ff) == 0x000000a1)
И аналогично:
if ((testVar & 0x000000ff) == 0xa1)
Добро пожаловать в СО. Вам нужно взглянуть на таблицу приоритетов ваших операторов.
==имеет более высокий приоритет, чем&. Это означает, что ваше состояние такое же, какtestVar & (0x000000ff == 0x000000a1), которое такое же, какtestVar & 0. Вам нужно использовать((testVar & 0x000000ff) == 0x000000a1)