2011-12-30 2 views
5

Почему первая способна правильно прирастить pbf_ [k], а вторая даже не делает это (увеличивать) за один раз?В чем разница между этими двумя блоками кода C++?

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]++; 
} 
+0

Ну, вы должны проверить значение M внутри каждой итерации, а также после них, и вы должны увидеть разницу ... –

ответ

7

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

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

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

+3

В случае, если @John не понимает, '&' побитовое И, а не логическое И, поэтому результат представляет собой целое число. Целое число, отличное от нуля, которое вычисляется в булевом контексте, истинно, но оно не равно значению 'true' как целому *, которое равно 1. –

+0

Другим способом исправить это было бы использование явного приведения в' bool'. Однако это глупо, поскольку по сравнению с «истинным» глупо в первую очередь. Точно так же, как фраза «правда, что« почти всегда лишняя по-английски, «== true» почти всегда является излишней в программировании. –

0

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

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

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

+1

Нет, они не имеют такого же эффекта, и ваше описание второго теста, я считаю, неверно. См. Ответ Бо Перссона. – Mat

0

Вы сначала проверить

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

является assining некоторого значения переменной т и принимаются, если в действительности.

0

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

Пример:

если ((т = (bit_table_ [к] [я] [bit_index] & & bit_mask [бит])) == TRUE)

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

+0

Нет, он действительно хочет поразрядного оператора, потому что ему нужно проверить, что определенный бит установлен в обоих значениях. Однако ему нужно ** не ** сравнивать результат с «истинным», потому что это эквивалентно сравнению с «1», когда это может быть какое-то другое ненулевое значение даже в «совпадении». @BoPersson это правильно. –

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