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

Posted

技术标签:

【中文标题】C语言中&和&&的区别?【英文标题】:Difference between & and && in C? 【发布时间】:2018-09-12 00:25:19 【问题描述】:

&&& 在 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。

【问题讨论】:

&位与&&逻辑与 如果你没有找到这两个运算符的规范,你肯定需要提高你的搜索技巧! @FredLarson 我知道的很多,但我只在(如果 y > 3 && x @hyde C99 添加了_Bool 类型和stdbool.h 类型定义为bool_Bool 我不认为它太宽泛了。这很容易回答。如果没有合适的重复,我们应该回答它。 【参考方案1】:

&位与&&逻辑与

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

表达式x & y 将对xy 中的每个单独的位执行按位运算。因此,如果x 在二进制中是1010 并且y1100,那么x & y 将评估为1000。请注意,x & y 的返回值不应被解释为布尔值,即使它是可能的。在早期的 C 中,运算符&& 不存在,因此& 被用于此目的。

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

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

我不确定为什么这会在一种情况下返回 true,而在另一种情况下返回 false。

x & y 的返回值应该被视为布尔值。但是,它可以(取决于代码的编写方式)被视为布尔数组。如果您有两个整数,flags1flags2,那么flags1 & flags2 的结果将表示在flags1flags2 中切换的标志。

【讨论】:

应该是if both x and y are non-zero,。可选& is the same as a bitwise multiply or bitwise binary and on pairs of corresponding bits in x and y. 应该是:& 的优先级低于比较运算符 <<===!=>=>。请参阅 cyclaminist 对原始问题的评论,例如 a & b == 1 被视为 a & (b == 1) 。最初 C 没有逻辑运算符,而是使用二元运算符作为替代。当 &&|| 等逻辑运算符被添加到 C 语言中时,二元运算符 &|^ 的优先级应该提高了,但 Kernighan 和 Ritchie 担心倒退兼容性。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

&&(逻辑与运算符) - 左右操作数是boolean 表达式。 如果两个操作数都不为零,则条件为真。

>

&(按位和运算符) - 左右操作数是integral 类型。二进制 AND 运算符复制一点到结果,如果 两个操作数中都存在它。

在您老师的示例a && b 中,左操作数4 和右操作数8 均非零。所以条件会成立。

在您老师的另一个示例a & b 中,左操作数40100 和右操作数801000 不向结果复制任何位。这是因为两个操作数中都没有共同的设置位。

【讨论】:

【参考方案4】:

& 是按位运算符,并且 && 是合乎逻辑的,例如,如果您使用两个数字并且要使用按位运算符,则可以编写 & 。 如果你想使用 to 短语并且你想在逻辑上对待它们,你可以使用 && 。

【讨论】:

欢迎来到 Stack Overflow。这个问题已经有两个很好的答案了。这个新答案是否提供了尚未涵盖的任何信息?请阅读How to Answer。

以上是关于C语言中&和&&的区别?的主要内容,如果未能解决你的问题,请参考以下文章

C语言:采用递归调用函数方法计算Fibonacci数列的前20项

c语言中取地址符和*有啥区别?

&和&&的区别

C语言里且和或是啥符号

c 编程中的 * 和 & 运算符有啥区别?

在 C 中,作为参数传递时,`&function` 和 `function` 有啥区别?