C++ 这两个c++;代码块?

C++ 这两个c++;代码块?,c++,if-statement,boolean,C++,If Statement,Boolean,为什么第一个能够正确地增加pbf_k,而第二个甚至一次都没有(增加) 代码1: for(int k=0;k<5;k++) { if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true) pbf_[k]++; } for(int k=0;k第一个on测试将位表[k][i][位索引]和位掩码[bit]的值赋值给m的结果,而第二个on只测试 bit\u table\uk[i][bit\u

为什么第一个能够正确地增加pbf_k,而第二个甚至一次都没有(增加)

代码1:

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

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

for(int k=0;k第一个on测试将
位表[k][i][位索引]和位掩码[bit]
的值赋值给m的结果,而第二个on只测试

bit\u table\uk[i][bit\u index]&bit\u mask[bit]
结果不是0

这两种方法的效果相同,只是第一种方法在每次迭代中都以m为单位记录结果。

首先检查

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

将某个值分配给变量m,if将其视为true。

在第一种情况下,屏蔽结果在与true进行比较之前转换为bool
m

在第二种情况下,我认为位掩码是某种整数类型。在这种情况下,
true
将被提升为相同的整数类型(并且具有值1)


只要从比较中删除
==true
,使它们相等即可。

我发现您的代码中有一个问题。您需要使用&&而不是&。 相比之下,&&是一个逻辑运算符,它不同于&--位运算符

例如:

if((m=(位表[k][i][位索引]&位掩码[bit])==true)


学习C++中的运算符,可以访问:http://www.worldbestlearningcenter.com/index_files/c++_operators.htm

您应该检查每次迭代中以及迭代后M的值,您应该看到它们之间的差异……如果@John没有意识到,
&
是按位和,而不是逻辑和,因此结果是一个整数。A在布尔上下文中计算的非零整数为true,但它不等于
true
作为整数的值,即1。解决此问题的另一种方法是使用显式转换到
bool
。然而,与
true
相比,这是愚蠢的。与短语“it is true that”相同在英语中几乎总是多余的,
==true
在编程中几乎总是多余的。不,它们没有相同的效果,我相信您对第二个测试的描述是不正确的。请参见Bo Persson的答案。不,他确实需要逐位运算符,因为他需要检查两个值中是否设置了特定的位。但是,he不需要将结果与
true
进行比较,因为这相当于将其与
1
进行比较,即使在“匹配”中,它也可能是其他非零值。@Boperson是正确的。
for(int k=0;k<5;k++)    
 {
   if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true)
        pbf_[k]++;
 }
if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)