Оператор равенства ==
имеет более высокий приоритет, чем оператор побитового оператора И &
.
В первом случае временная переменная temp
получает исправленное значение, а последовательное сравнение дает правильный результат.
Во втором примере сравнение происходит раньше, чем результат сравнения аннулируется по битам с mask
.
Поскольку сравнение дает только 1 или 0 для true или false соответственно, еслибит 0 в (bits >> i)
установлен, результат всегда будет истинным (с mask==0x1
) и ложным в противном случае.
Код для работы должен использовать круглые скобки, чтобы изменить порядок вычисления, как показано ниже:
void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
unsigned int mask = 0x1;
if ( (mask & (bits >> i)) == mask) //note brackets
printf("true");`
}