【问题标题】:Difference between | and || , or & and && [duplicate]之间的区别 |和 || , 或 & 和 && [重复]
【发布时间】:2016-04-02 05:49:23
【问题描述】:

这是在 Dev-cpp C++ 5.4.2 上用 C++ 编写的两个简单示例:

float a, b, c;

if (a | b  & a | c)
   printf("x = %.2f\tF = %.0f\n", x, F);
else
   printf("x = %.2f\tF = %.2f\n", x, F);

这个代码:

float a, b, c;

if (a || b  && a || c)
   printf("x = %.2f\tF = %.0f\n", x, F);
else
   printf("x = %.2f\tF = %.2f\n", x, F);

谁能告诉我|| > |& > && 之间的区别。第二个代码有效,但第一个无效。 编译器会给出错误信息:

[错误] 'float' 和 'float' 类型的无效操作数到二进制 'operator&'。

【问题讨论】:

标签: c++ bitwise-operators


【解决方案1】:

运算符|&~ 并行作用于各个位。它们只能用于整数类型。 a | ba 的每一位与b 的相应位进行独立的或运算,以生成该位结果。

运算符||&&! 将每个完整的操作数作为单个true/false 值作用。可以使用任何隐式转换为bool 的数据类型。许多数据类型,包括 float 隐式转换为 bool 并隐含 !=0 操作。

||&& 也是“短路”。这意味着只要结果的值可以仅由第一个操作数确定,则不会计算第二个操作数。示例:

ptr && (*ptr==7) 如果ptr 为零,则结果为假,不存在因取消引用零而导致段错误的风险。

您可以将其与 (int)ptr & (*ptr) 进行对比。忽略这将是一个奇怪的操作甚至想要的事实,如果(int)ptr 为零,则整个结果将为零,因此人们可能会认为在这种情况下您不需要第二个操作数。但是程序很可能会同时计算两者。

【讨论】:

    【解决方案2】:

    您似乎对运算符的符号感到困惑。这些符号实际上分为两个不同的类别,即位运算符逻辑运算符。尽管它们使用相同的符号,但您应该将它们视为不同的运算符。这两个类别的真值表相似,但含义不同。也许这就是人们使用类似符号来表示运算符的原因。

    bit-wise operators

    ~  // NOT
    &  // AND
    |  // OR
    ^  // XOR
    

    按位运算符会将其所有操作数视为二进制数字,并根据操作数的每一位上的按位真值表进行操作。

    Bit-wise Truth Table
    
    x   y   x&y x|y x^y
    0   0   0   0   0
    1   0   0   1   1
    0   1   0   1   1
    1   1   1   1   0
    
    x   ~x
    0   1
    1   0
    

    logical operators

    !   // Logical NOT (negation)
    &&  // Logical AND (conjunction)
    ||  // Logical OR  (disjunction)
    

    逻辑运算符会将其所有操作数视为布尔值,并根据运算符真值表进行操作。任何不等于0 的数字将是true,否则将是false

    Logical Truth Table
    
    x   y    x&&y   x||y
    F   F    F      F
    T   F    F      T
    F   T    F      T
    T   T    T      T
    
    x   !x
    F   T
    T   F
    

    例如:

    int a = 10;  // a = 0000 .... 0000 1010  <-- a 32 bits integer
                 // a is not zero -> true
    int b = 7;   // b = 0000 .... 0000 0111  <-- a 32 bits integer
                 // b is not zero -> true
    

    那么对于位运算符:

    assert(a & b == 2);   // 2 = 0000 .... 0000 0010  <-- every bit will & separately
    

    对于逻辑运算符:

    assert(a && b == true);  // true && true -> true
    

    【讨论】:

      【解决方案3】:

      位运算符,它们是 | (OR)、&amp; (AND)、^ (XOR) 和 ~(补码)按照您的期望进行操作做:他们对位执行上述操作。
      关于您的编译问题,there are no bitwise operations for floating point numbers

      逻辑运算符,即|| (OR)、&amp;&amp; (AND) 和 ! (NOT) 只知道值 truefalse。 如果表达式的值不是0,则表达式为true。如果其值等于0,则为false
      逻辑运算符首先执行此操作。然后他们执行相应的操作:

      • ||: true 如果至少有一个操作数是true
      • &amp;&amp;: true 如果两个操作数都是true
      • !: true 如果操作数是 false

      注意all logical operators are short-circuit operators

      【讨论】:

        【解决方案4】:

        浮点数不支持位运算

        或者,如果你真的需要检查,你可以在使用它们之前施放(非常不鼓励),

        在这里查看如何将浮点数转换为整数,https://www.cs.tut.fi/~jkorpela/round.html

        【讨论】:

        • 非常感谢大家!你的 cmets 解决了我的问题 =)
        猜你喜欢
        • 2014-08-16
        • 2011-04-08
        • 2012-11-24
        • 2013-06-05
        • 2021-09-29
        • 2020-05-27
        • 2016-03-23
        • 2012-08-11
        • 2012-11-24
        相关资源
        最近更新 更多