之间的区别和|| , 或 & 和 &&
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 | b
对a
的每一位与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.
逻辑运算符,即||
(或)、&&
(与)和!
(非)只知道值 true
和 false
.
如果表达式的值不是 0
,则表达式为 true
。如果其值等于 0
.
,则为 false
逻辑运算符首先执行此操作。然后他们执行相应的操作:
||
: true
如果至少一个操作数是 true
&&
: true
如果两个操作数都是 true
!
: true
如果操作数是 false
注意 all logical operators are short-circuit 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 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
这是在 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 | b
对a
的每一位与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.
逻辑运算符,即||
(或)、&&
(与)和!
(非)只知道值 true
和 false
.
如果表达式的值不是 0
,则表达式为 true
。如果其值等于 0
.
,则为 false
逻辑运算符首先执行此操作。然后他们执行相应的操作:
||
:true
如果至少一个操作数是true
&&
:true
如果两个操作数都是true
!
:true
如果操作数是false
注意 all logical operators are short-circuit 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 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