【问题标题】:Int considered as bool, & operatorInt 被视为 bool 和 & 运算符
【发布时间】:2012-06-24 19:25:03
【问题描述】:

我一直在为我的部分代码苦苦挣扎,我终于发现问题出在一个简单的测试上,它没有给我预期的结果。

if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true

我不明白为什么第二行会导致错误。 我的理解是每个非零整数在测试中都被认为是真的。

【问题讨论】:

  • & 是位运算符,&& 是逻辑与运算符。

标签: c++ operators boolean int


【解决方案1】:

因为2true 之间的按位和 为假。

&(位运算符)不同于&&(逻辑运算符)。

true 转换为 int1

所以2 & true2 & 1 这是错误的 - 因为0000000000000010 & 0000000000000001 == 0。 (位可能会有所不同)

bool(2) == 11 & 1true

【讨论】:

  • 有空的时候,你会看看我对同一个问题的回答吗?我问的原因是我的回答对 C++11 标准和编译器(或 CPU?)行为的观点犹豫不决。
  • @LuchianGrigore: 在需要积分时,是否指定了 true 以外的任何位置,或者应将其转换为 1,或者就标准而言,任何正整数值都可以(例如:0b11111111) ?
  • @MatthieuM。我相信除了0 之外的任何值都是true,但是true 被转换为1,是的。不过现在没有时间寻找报价。
  • @MatthieuM。在 C++03 中,它是 4.5,Integral Promotions,第 4 段,“bool 类型的右值可以转换为 int 类型的右值,false 变为 0,true 变为 1。”
【解决方案2】:

您需要&& 而不是&

&& 是布尔值and 运算符,而& 是二进制“和”,因此2 & true0010 & 0001 = 0000 -> false 相同,而2 && true = true

【讨论】:

    【解决方案3】:

    & 在所有位之间进行 AND(调用按位 AND),您需要的是 && 运算符(布尔 AND)。

    二进制中的 2 是 '10' 并且 true 是二进制中的 1 (01),因此结果 10 & 01 是 0 。

    bool(2) 将 2 转换为 true ,二进制为 01,01 & 01 为 01。

    【讨论】:

      【解决方案4】:
      if (2) //=> true
      

      到目前为止,一切都很好。

      if (2 & true) //=> false
      

      这里的条件计算为2 & 1 == 0,因为&是位运算符,2和1分别是二进制的00000010和00000001。

      if (bool(2) & true) //=> true
      

      有趣的是,在我的编译器上,我似乎回忆起在某些情况下出现的不稳定行为;并且,如果教派。 C++11 标准的 4.12 解决了这个问题,它以我不理解的方式这样做。我似乎记得看到我的编译器让bool(2) == 2,这是没有人预料到的。这是否代表我的编译器中的错误或记忆中的错误,我不知道。

      但我怀疑您需要逻辑运算符 && 而不是按位运算符 &

      测验

      要检查您的理解,请尝试

      if (3 & true) //=> true
      

      你明白为什么吗? (提示:3 的二进制表示为 00000011。)

      【讨论】:

      • 如果bool(2) == 2,那么肯定有问题。要么编译器行为不端,要么你有一个包含#define bool int· 之类的邪恶头文件你使用的是哪个编译器?
      • @MikeSeymour: GCC 4.4(我知道,它大部分不符合 C++11,但有人怀疑使用的标准版本是这里的问题)。但是,根据您的评论,我现在无法重现该行为,尽管我似乎记得在过去一年中遇到过这种行为。很抱歉浪费您的时间。如果我在最新的编译器中再次遇到这种行为,我应该向 GCC 的开发人员提交一份适当的错误报告。目前,我将很快在这里编辑我的答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多