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】:
&
是位与,&&
是逻辑与。
如果x
和y
均非零,则表达式x && y
将返回1
,否则返回0
。请注意,如果 x
为零,则根本不会评估 y
。如果y
是具有副作用的表达式,这将很重要。这种行为称为短路。
表达式x & y
将对x
和y
中的每个单独的位执行按位运算。因此,如果x
在二进制中是1010
并且y
是1100
,那么x & y
将评估为1000
。请注意,x & y
的返回值不应被解释为布尔值,即使它是可能的。在早期的 C 中,运算符&&
不存在,因此&
被用于此目的。
解释它的一种方法是,您可以想象&
与在操作数的每个单独位上应用&&
相同。
还要注意&
的优先级低于&&
,尽管直觉说它应该是相反的。这也适用于比较运算符,例如<
、<=
、==
、!=
、>=
、>
。这可以追溯到 C 没有运算符 &&
和 ||
的时候,而是使用了按位版本。这时候,它是有道理的,但是当添加了逻辑运算符时,它就不再有意义了。 Kernighan 和 Ritchie 承认这会更有意义,但他们没有修复它,因为这会破坏现有代码。
我不确定为什么这会在一种情况下返回 true,而在另一种情况下返回 false。
x & y
的返回值应该不被视为布尔值。但是,它可以(取决于代码的编写方式)被视为布尔数组。如果您有两个整数,flags1
和 flags2
,那么flags1 & flags2
的结果将表示在flags1
和flags2
中切换的标志。
【讨论】:
应该是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 中不存在的二进制表示法),这导致0b00000000
或0
。
&&
运算符对其布尔操作数执行逻辑与 运算,产生布尔结果。因此(8 && 4)
等价于((8 != 0) and (4 != 0))
或(true and true)
,结果为true
。
【讨论】:
【参考方案3】:&&(逻辑与运算符) - 左右操作数是
boolean
表达式。 如果两个操作数都不为零,则条件为真。
>
&(按位和运算符) - 左右操作数是
integral
类型。二进制 AND 运算符复制一点到结果,如果 两个操作数中都存在它。
在您老师的示例a && b
中,左操作数4
和右操作数8
均非零。所以条件会成立。
在您老师的另一个示例a & b
中,左操作数4
或0100
和右操作数8
或01000
不向结果复制任何位。这是因为两个操作数中都没有共同的设置位。
【讨论】:
【参考方案4】:& 是按位运算符,并且 && 是合乎逻辑的,例如,如果您使用两个数字并且要使用按位运算符,则可以编写 & 。 如果你想使用 to 短语并且你想在逻辑上对待它们,你可以使用 && 。
【讨论】:
欢迎来到 Stack Overflow。这个问题已经有两个很好的答案了。这个新答案是否提供了尚未涵盖的任何信息?请阅读How to Answer。以上是关于C语言中&和&&的区别?的主要内容,如果未能解决你的问题,请参考以下文章