2011-12-30 84 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值以及它们之后,你应该看到差异... – 2011-12-30 09:59:12

回答

7

在第一种情况下,掩蔽结果在与真实值比较之前转换为bool m

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

只需从比较中删除== true即可使其相同。

+3

如果@John没有意识到,'&'是按位AND,而不是逻辑AND,所以结果是一个整数。在布尔上下文中计算的非零整数为真,但它不等于“true”的值,作为整数*,为1。 – 2011-12-30 10:04:26

+0

解决此问题的另一种方法是对“bool”使用明确的转换。然而,这很愚蠢,因为与“真”相比,首先是愚蠢的。就像“这是真的”这个词在英语中几乎总是多余的一样,'== true'在编程中几乎总是多余的。 – 2011-12-30 10:17:45

0

在第一测试分配给的bit_table_[k][i][bit_index ] & bit_mask[bit]值的米的结果,而第二刚测试是否

bit_table_[k][i][bit_index ] & bit_mask[bit]结果不是0

两者的效果都是一样的,只是第一次在每次迭代中记录结果为m。

+1

不,它们不具有相同的效果,我相信您对第二个测试的描述不正确。见波佩尔松的答案。 – Mat 2011-12-30 10:10:53

0

您首先检查

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

是assining一定的参考价值变量m,如果为真时所采取的。

0

我在代码中发现了一个问题。您需要使用& &而不是&。 比较而言,& &是一个逻辑运算符,它不同于& - 双向运算符。

实施例:

如果((M =(bit_table_ [K] [I] [bit_index] & & BIT_MASK [比特]))== TRUE)

要了解操作员在C++中可以请访问:http://www.worldbestlearningcenter.com/index_files/c++_operators.htm

+0

不,他确实需要一个按位运算符,因为他需要检查两个值中是否设置了特定的位。然而,他需要**而不是**将结果与'true'进行比较,因为这相当于将其与'1'进行比较,即使在“匹配”时它可能还有其他非零值。 @BoPersson是对的。 – 2011-12-30 10:16:09