|与| |之间的差异,或&;及&; 这是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