|之间的区别和||或者&和&&

时间:2015-12-28 11:16:36

标签: c++ bitwise-operators

这是在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'到二进制'运算符&'的操作数无效。

4 个答案:

答案 0 :(得分:10)

运算符|&~并行处理各个位。它们只能用于整数类型。 a | ba的每个位执行独立的OR运算,并使用b的相应位来生成结果的该位。

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

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

ptr && (*ptr==7)如果ptr为零,则结果为false,不会因解除引用零而产生任何段错误的风险。

您可以将其与(int)ptr & (*ptr)进行对比。如果(int)ptr为零,忽略这将是一个奇怪的操作的事实,整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数。但无论如何,该计划可能都会计算。

答案 1 :(得分:3)

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

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)

逻辑运算符将其所有操作数视为bool并根据运算符真值表进行操作。任何不等于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

答案 2 :(得分:1)

位运算符,它们是|(OR),&(AND),^(XOR)和~(补充)做你期望他们做的事情:他们对比特进行上述操作 关于编译问题,there are no bitwise operations for floating point numbers

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

  • 0||如果至少有一个操作数为true
  • true&&如果两个操作数均为true
  • true!如果操作数为true

注意 all logical operators are short-circuit operators

答案 3 :(得分:0)

浮点

不支持按位运算

或者,如果你真的需要检查,你可以在使用之前进行投射(非常气馁),

点击此处查看如何将浮点数转换为积分https://www.cs.tut.fi/~jkorpela/round.html