【问题标题】:what is the difference between these two c++ code blocks?这两个 c++ 代码块有什么区别?
【发布时间】:2012-01-30 11:36:31
【问题描述】:

为什么第一个能够正确递增 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]++;
 }

【问题讨论】:

  • 那么你应该在每次迭代中以及在它们之后检查 M 的值,你应该会看到差异......

标签: c++ if-statement boolean


【解决方案1】:

第一个on测试bit_table_[k][i][bit_index ] &amp; bit_mask[bit]的值赋值给m的结果,而第二个只是测试是否

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

两者效果相同,只是第一个在每次迭代时以 m 记录结果。

【讨论】:

  • 不,它们没有相同的效果,我相信你对第二个测试的描述是不正确的。请参阅 Bo Persson 的回答。
【解决方案2】:

你先检查

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

正在为变量 m 分配一些值,如果为真,则该值被采用。

【讨论】:

    【解决方案3】:

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

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

    只需从比较中删除 == true 以使它们等效。

    【讨论】:

    • 如果@John 没有意识到,&amp; 是按位与,而不是逻辑与,所以结果是一个整数。在布尔上下文中计算的非零整数为真,但它不等于 true 的值作为整数,即 1。
    • 解决此问题的另一种方法是对bool 使用显式强制转换。但是,这很愚蠢,因为与 true 相比首先是愚蠢的。就像“它是真的”这句话在英语中几乎总是多余的一样,== true 在编程中几乎总是多余的。
    【解决方案4】:

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

    例子:

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

    要了解 C++ 中的运算符,您可以访问:http://www.worldbestlearningcenter.com/index_files/c++_operators.htm

    【讨论】:

    • 不,他确实需要按位运算符,因为他需要检查两个值中是否设置了特定位。但是,他需要将结果与true 进行比较,因为这相当于将其与1 进行比较,即使在“匹配”上它也可能是其他一些非零值。 @BoPersson 说得对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2018-01-14
    • 2014-09-28
    • 2011-12-24
    相关资源
    最近更新 更多