C++ 这两个c++;代码块?
为什么第一个能够正确地增加pbf_k,而第二个甚至一次都没有(增加) 代码1: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
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进行比较之前转换为boolm
在第二种情况下,我认为位掩码是某种整数类型。在这种情况下,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)