C中&和&&的区别?

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.

klu*_*utt 8

&按位的,而且&&合乎逻辑的.

表达式x && y将返回1如果同时xy不为零,和0其他.请注意,如果x为零,则y根本不会进行评估.

该表达式x & y将对x和中的每个位执行按位运算y.所以,如果x1010二进制,并y1100随后x & y将评估到1000.请注意,返回值x & y不应解释为布尔值.

解释它的一种方法是你可以想象这&与应用&&操作数中的每个单独位相同.

还要注意,&优先级低于&&,尽管直觉说它应该是另一种方式.这还要比较运营商,像<,<=,==,!=,>=,>.这可以追溯到C没有运算符的时候&&,||而是使用了按位版本.在这个时候,它是有道理的,但是当添加逻辑运算符时,它就不再存在了.Kernighan和Ritchie承认它会更有意义,但他们没有修复它,因为这会破坏现有的代码.

我不确定为什么这会在一个场景中返回true而在另一个场景中返回false.

根本x & y不应将返回值视为布尔值.但是,它可以(取决于代码的编写方式)被视为布尔数组.如果有两个整数,并且随后的结果将表示可在其中切换标志和.flags1flags2flags1 & flags2 flags1flags2


Dav*_*ble 6

&运算符对其整数操作数执行按位与运算,产生整数结果。因此(8 & 4)(0b00001000 bitand 0b00000100)为了清楚起见,使用标准 C 中不存在的二进制表示法),结果为0b000000000

该运算符对其布尔操作数&&执行逻辑与运算,产生布尔结果。因此(8 && 4)相当于((8 != 0) and (4 != 0)), 或(true and true), 其结果是true