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

Bor*_*iga 3 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);
Run Code Online (Sandbox Code Playgroud)

而这段代码:

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);
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我之间的差异||> |&> &&.第二个代码有效,但首先没有.编译器给出了一条错误消息:

[错误]类型'float'和'float'到二进制'运算符&'的操作数无效.

JSF*_*JSF 11

运营商|,&~作用于平行的各个位.它们只能用于整数类型. a | b每个位的独立OR运算a与相应的位进行,b以产生该位的结果.

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

||并且&&还"短路".这意味着只要第一个操作数可以确定结果的值,就不会计算第二个操作数.例:

ptr && (*ptr==7) 如果ptr为零,则结果为false,而没有任何因解除引用零而导致段错误的风险.

你可以与之形成对比(int)ptr & (*ptr).忽略这个甚至是想要的奇怪操作的事实,如果(int)ptr为零,则整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数.但无论如何,该计划可能会计算两者.


Jae*_*ege 8

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

按位运算符

~  // NOT
&  // AND
|  // OR
^  // XOR
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

逻辑运算符

!   // Logical NOT (negation)
&&  // Logical AND (conjunction)
||  // Logical OR  (disjunction)
Run Code Online (Sandbox Code Playgroud)

逻辑运算符会将其所有操作数视为布尔值,并根据运算符真值表进行操作。任何不等于的数字都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
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)

那么对于按位运算符:

assert(a & b == 2);   // 2 = 0000 .... 0000 0010  <-- every bit will & separately
Run Code Online (Sandbox Code Playgroud)

对于逻辑运算符:

assert(a && b == true);  // true && true -> true
Run Code Online (Sandbox Code Playgroud)