这是在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'到二进制'运算符&'的操作数无效。
答案 0 :(得分:10)
运算符|
,&
和~
并行处理各个位。它们只能用于整数类型。 a | b
对a
的每个位执行独立的OR运算,并使用b
的相应位来生成结果的该位。
运算符||
,&&
和!
作为单个true
/ false
值对每个操作数执行操作。可以使用隐式转换为bool
的任何数据类型。许多数据类型(包括float
隐式转换为bool,隐含!=0
操作。
||
和&&
也是“短路”。这意味着只要第一个操作数可以确定结果的值,就不会计算第二个操作数。示例:
ptr && (*ptr==7)
如果ptr
为零,则结果为false,不会因解除引用零而产生任何段错误的风险。
您可以将其与(int)ptr & (*ptr)
进行对比。如果(int)ptr
为零,忽略这将是一个奇怪的操作的事实,整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数。但无论如何,该计划可能都会计算。
答案 1 :(得分:3)
您似乎对运营商的符号感到困惑。这些符号实际上分为两个不同的类别,即逐位运算符和逻辑运算符。尽管它们使用相同的符号,但您应将它们视为不同的运算符。两个类别的真值表相似,但含义不同。也许这就是人们为操作员使用类似符号的原因。
~ // 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 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
答案 3 :(得分:0)
或者,如果你真的需要检查,你可以在使用之前进行投射(非常气馁),
点击此处查看如何将浮点数转换为积分https://www.cs.tut.fi/~jkorpela/round.html