|与| |之间的差异,或&;及&; 这是C++编写的两个简单的示例,分别在DEV CPP C++ +4.2:< /P> 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);

|与| |之间的差异,或&;及&; 这是C++编写的两个简单的示例,分别在DEV CPP C++ +4.2:< /P> 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);,c++,bitwise-operators,C++,Bitwise Operators,该代码: 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&”无效 运算符|、&和~并行作用于各个位。

该代码:

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&”无效


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

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

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

ptr&&(*ptr==7)
如果
ptr
为零,则结果为假,不存在通过取消引用零导致seg故障的风险

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

按位运算符,即
(或)、
&
(和)、
^
(XOR)和
~
(补码)执行您希望它们执行的操作:它们对位执行上述操作。
关于你的汇编问题

逻辑运算符,它们是
|
(或)、
&&
(和)和
(不)只知道值
true
false

如果表达式的值不是
0
,则表达式为
true
。如果其值等于
0

逻辑运算符首先执行此操作。然后执行相应的操作:

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

请注意。

您似乎与运算符的符号混淆了。这些符号实际上分为两个不同的类别,即位运算符逻辑运算符。虽然它们使用相同的符号,但应将它们视为不同的运算符。两个类别的真值表相似,但含义不同。也许这就是为什么人们对操作符使用类似的符号

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

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

逻辑运算符将其所有操作数视为布尔运算,并根据运算符真值表进行操作。任何不等于
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
浮点不支持按位操作 或者,如果你真的需要检查,你可以在使用它们之前施放(非常不鼓励)


检查这里如何将浮点转换成积分,

从那里可以得到一些起始点,关于指针和比较运算符,我发现它是奇怪的,C++不允许在浮点上进行按位运算,虽然可以说它们没有多大意义,这些仍然是位序列,通过这种逻辑,人们可以对它们进行算术运算。@WillemVanOnsem,为了支持二进制运算,它们需要添加一个新类型,例如
binary32
binary64
等,以及一组转换函数。它们在C++中语义上不同,但人们看不到它,因为它们在语法上与整数不同。话虽如此,一些聪明人走了这条路,例如C。在我看来,这不是一个明显的设计决定,非常感谢大家!你的评论解决了我的问题=)
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