c - C语言中&和&&的区别?

标签 c bitwise-operators logical-operators

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 而在另一种情况下返回 false。

最佳答案

&按位与&&逻辑和

表达式x && y将返回 1如果两个xy是非零的,并且 0否则。请注意,如果 x为零,则 y根本不会评价。如果y,这将很重要是一个有副作用的表达式。这种行为称为短路

表达式x & y将对 x 中的每个单独位执行按位运算和 y .所以如果x1010二进制和y1100然后x & y将评估为 1000 .注意 x & y 的返回值不应被解释为 bool 值,即使可能。在早期的 C 中,运算符 &&不存在,因此&用于此目的。

解释它的一种方法是,您可以想象 &与应用 && 是一样的在操作数中的每个单独的位上。

另请注意 &优先级低于 && ,尽管直觉告诉我们应该反过来。这也适用于比较运算符,例如 < , <= , == , != , >= , > .这可以追溯到 C 没有运算符 && 的时候和 ||并且使用了按位版本。这个时候是有道理的,但是加上了逻辑运算符就没有了。 Kernighan 和 Ritchie 承认这会更有意义,但他们没有修复它,因为这会破坏现有代码。

I'm not sure why this would return true in one scenario and false in another.

x & y 的返回值根本不应该被视为 bool 值。但是,它可以(取决于代码的编写方式)被视为 bool 数组。如果你有两个整数,flags1flags2然后是 flags1 & flags2 的结果将表示在两者 flags1 中切换的标志和 flags2 .

关于c - C语言中&和&&的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617159/

相关文章:

c - 如何使用arduino检查元素是否包含在数组中?

c - 如何重置 c 中的链表?

javascript - Python ctypes.c_int 到 Perl XS(或非 XS)转换(Javascript 签名 32 位位移运算符转换)

mysql - h2 数据库按位操作(&)语法无效 MySql

binary - 三元计算机 : what would the third (unknown) part of a trit be used for?

javascript - 使用 || 的这段代码的确切含​​义是什么? ("OR") 运算符?

c - Inotify:仅监视文件夹内的某些文件

c - 如何使用 Nasm 汇编器使用 C-printf() 仅打印一定数量的字节?

java - 按位运算来比较值

python - AND 逻辑门的单层神经网络 (Python)