什么是用C &
和&&
之间的区别?
我的老师给我这个例子:
int a = 8;
int b = 4;
printf("a & b = %d\n", a & b);
printf("a && b = %d\n", a && b);
输出:
a & b = 0;
a && b = 1;
我不知道为什么会在一个场景中返回true,而在另一个假的。
&
是按位与和&&
是逻辑和。
表达x && y
将返回1
如果两个x
和y
不为零,否则0
。请注意,如果x
为零,那么y
将无法在所有的评估。
x & y
将x
和y
上每个单独的位执行逐位操作的表达。所以,如果x
是1010
二进制和y
是1100
然后x & y
将评估为1000
。需要注意的是x & y
的返回值不应该被解释为一个布尔值。
解释是,你可以想像,&
一种方式是同样的事情,在操作数每个单独应用位&&
。
还要注意的是&
比&&
优先级低,即使直觉说,这应该是周围的其他方法。这还要比较运营商,像<
,<=
,==
,!=
,>=
,>
。这又回到了当时当C没有运营商&&
和||
并代替按位版本。在这个时候,它是有道理的,但是当加入逻辑运算符,它没有了。 Kernighan和Ritchie承认,它会更有意义,但他们并没有解决这个问题,因为这会破坏现有的代码。
我不知道为什么会在一个场景中返回true,而在另一个假的。
从x & y
返回值不应该被作为一个布尔值,在所有接受治疗。但是,它可以(取决于代码是如何写的)被视为一个布尔矩阵。如果有两个整数,flags1
和flags2
然后flags1 & flags2
的结果将表示可在两个flags1
和flags2
触发该标志。
&&(逻辑和操作员) - 左侧和右侧的操作数是
boolean
表达式。如果两个操作数不为零,则条件为真。
>
&(按位与运算符) - 左侧和右侧的操作数是
integral
类型。二进制和运营商的副本,如果它存在于两个操作数了一下结果。
在老师的例子a && b
,左操作4
和右操作数8
都是非为零。所以病情会成为现实。
在老师的其他例子a & b
,左操作数4
或0100
和正确的操作8
或01000
副本没有位结果。这是因为在任何一个操作数没有共同的位。
所述&
运算符执行一个位方式和操作它的整数操作数,产生一个整数结果。因此(8 & 4)
是(0b00001000 bitand 0b00000100)
(使用不标准C存在,为了清楚的二进制符号),这导致0b00000000
或0
。
所述&&
操作者执行在其操作数的布尔逻辑与运算,产生一个布尔结果。因此(8 && 4)
相当于((8 != 0) and (4 != 0))
,或(true and true)
,这导致true
。