sad*_*asd 3 c bitwise-operators logical-operators
C &
和&&
C 之间有什么区别?
我的老师给了我这个例子:
int a = 8;
int b = 4;
printf("a & b = %d\n", a & b);
printf("a && b = %d\n", a && b);
Run Code Online (Sandbox Code Playgroud)
输出:
a & b = 0;
a && b = 1;
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这会在一个场景中返回true而在另一个场景中返回false.
&
是按位的,而且&&
是合乎逻辑的.
表达式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而在另一个场景中返回false.
根本x & y
不应将返回值视为布尔值.但是,它可以(取决于代码的编写方式)被视为布尔数组.如果有两个整数,并且随后的结果将表示可在其中切换标志都和.flags1
flags2
flags1 & flags2
flags1
flags2
该&
运算符对其整数操作数执行按位与运算,产生整数结果。因此(8 & 4)
((0b00001000 bitand 0b00000100)
为了清楚起见,使用标准 C 中不存在的二进制表示法),结果为0b00000000
或0
。
该运算符对其布尔操作数&&
执行逻辑与运算,产生布尔结果。因此(8 && 4)
相当于((8 != 0) and (4 != 0))
, 或(true and true)
, 其结果是true
。