【问题标题】:Confusion in evaluating == and &评估 == 和 & 时的困惑
【发布时间】:2013-08-06 08:37:57
【问题描述】:

为什么下面的说法:

int a = 10;
a&8 == 8; 

返回假(0)?

我知道==& 具有更高的优先级,但它仍然应该检查8 == 8 是否应该评估为true,但评估为false。

谁能帮我推理一下。

【问题讨论】:

    标签: c evaluation operator-precedence


    【解决方案1】:

    a & 8 == 8a & (8 == 8),因为== 的优先级高于& (here)

    所以8 == 81a = 10 这是1010 二进制

    所以

      00000001
    & 00001010
      --------
      00000000
    

    有趣的事实: 尽管 false 是零,而 true 是 C 语言中的任何非零值。但是,如果相等运算符评估为真,则它保证评估为值 10 否则。推荐人 C99 第 6.5.9 节第 3 段

    【讨论】:

      【解决方案2】:

      8 == 8 转换为int 的结果是1

      a & 8 == 8 因此变为a & 1,如果设置了a 的最低有效位,则为真。这只适用于 a 是奇怪的。

      由于a 是10,那么a & 10,因为10 是偶数。

      本例中的&位与,而不是逻辑与。逻辑与将导致表达式 a && 8 == 8 为真,因为 && 运算符的两边都不是零。

      但是,按位-and 会产生一个结果,其中“当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置”(C.11 §6.5.10 ¶4)。对于偶数,1s 位是0,所以按位与1 的结果是0

      由于按位与的结果是0,因此表达式被视为假。

      【讨论】:

        【解决方案3】:

        因为 10 在二进制中是 1010,而 8 == 8 的结果是 1。所以 0001 & 1010 是假的。

        【讨论】:

          【解决方案4】:
          a&8 == 8,
          
          = a&1 // because 8 == 8, is true
          
          = 0 // 1010 & 1 = 0
          

          【讨论】:

            【解决方案5】:

            因为8 == 8 为真,在C 中等于1,1 & 10 等于0,在C 中为假。

            【讨论】:

              【解决方案6】:

              当您执行按位与 (&) 运算时,a&1(8==8) 为真,即 10 & 1 结果为全 0。 O代表假。

              00000000 00001010 & 00000000 00001000 = 00000000 00000000 = False(假设 int 为 16 位)

              【讨论】:

                【解决方案7】:

                a&8 == 8被解析为a & (8==8),与a & 1相同。由于 a=10 甚至它的二进制表示在单位位置都有一个 0,所以a & 1 的结果是0

                【讨论】:

                  猜你喜欢
                  • 2022-08-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-01
                  • 2014-04-26
                  • 2021-12-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多