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

Difference between | and || , or & and &&

这是在 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);

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

[Error] invalid operands of types 'float' and 'float' to binary 'operator&'.

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

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

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

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

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

按位运算符,即|(或)、&(与)、^(异或)和~(补)做你期望他们做的:他们对位执行上述操作。
关于您的编译问题,there are no bitwise operations for floating point numbers.

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

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

注意 all logical operators are short-circuit operators.

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

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

浮点不支持按位运算

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

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