В чем разница между этими двумя блоками кода C ++? - PullRequest
5 голосов
/ 30 декабря 2011

Почему первый способен правильно увеличивать pbf_ [k], а второй даже не делает этого (увеличиваться) за один раз?

unsigned pbf_[5] ={0}; 
 bool m=0;

Код 1:

for(int k=0;k<5;k++)    
 {

  if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)    
     pbf_[k]++;
  }

Код 2:

for(int k=0;k<5;k++)    
 {
   if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true)
        pbf_[k]++;
 }

Ответы [ 4 ]

7 голосов
/ 30 декабря 2011

В первом случае результат маскирования преобразуется в bool m, прежде чем его сравнивают с истинным.

Во втором случае я считаю, что битовые маски являются целочисленным типом.В этом случае true будет преобразован в тот же тип целого числа (и будет иметь значение 1).

Просто удалите == true из сравнения, чтобы сделать их эквивалентными.

0 голосов
/ 30 декабря 2011

Я нашел одну проблему в вашем коде.Вам нужно использовать && вместо &.Для сравнения && является логическим оператором и отличается от & - побитового оператора.

Пример:

if ((m = (bit_table_ [k] [i] [bit_index] && bit_mask)[bit])) == true)

Чтобы узнать об операторе в C ++, посетите: http://www.worldbestlearningcenter.com/index_files/c++_operators.htm

0 голосов
/ 30 декабря 2011

Сначала вы проверяете

if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)

, присваивает ли переменная m некоторое значение, и оно принимается if как true.

0 голосов
/ 30 декабря 2011

первый из них проверяет результат присвоения m значения bit_table_[k][i][bit_index ] & bit_mask[bit], а второй только проверяет, является ли

bit_table_[k][i][bit_index ] & bit_mask[bit] результаты не 0

Оба эффекта одинаковы, за исключением того, что первый записывает результат в m на каждой итерации.

...