在C语言中,符号&是否表示逻辑与(&&)?

4
有时我想要做这样的事情(其中i和j是整数)。
(if i==4 && j==9)
{
   ...
}

如果i等于4且j等于9,则它将通过括号。我一直使用单个&而不是双个&,我的代码一直在编译和运行。

它是否与双个&&执行相同的操作?如果不是,它一直在做什么?

编辑:哦,我也一直在使用“或”,使用“|”代替“||”。


不,它不是一种速记法,尽管它们可能经常看起来是等价的。一个是“按位与”,一个是“短路逻辑与”(使用这些术语有很多信息)。 - user166390
4个回答

9
据我理解,您的意思是 if (i==4 && j==9)
在这种情况下,将其从 && 更改为 & 不应该改变太多。最大的变化是,使用 && 时,只有当 i==4 部分为真时,才会评估 j==9,但是使用 &,无论如何都会评估两者。
当您遇到类似 if (x != NULL && x->whatever ...) 的情况时,您需要确保仅在 x 不是空指针时才评估第二部分(解引用 x)。但是,在您的情况下,比较看起来像 int 是不太可能产生任何问题的。
当您处理可能产生除 1 以外的值以表示 true 的内容时,也可能遇到问题。同样,在此处不是问题,因为 == 将始终产生 01。例如,如果您使用 <ctype.h> 中的 isalphaislower 等,则它们仅需要产生 0 或非零值。如果将其与 & 结合使用,则会得到位运算的 or,这可能会对两个非零输入产生 0(例如,1 & 2 == 0,但是 1 && 2 == 1)。
当您在 == 的结果上使用按位 and 时,您将获得 0 & 00 & 11 & 01 & 11 & 1 将产生 1(真)。所有其他情况都将产生 0(假),就像 && 一样。

+1. "如果 (x != NULL && x->whatever ...),你想确保第二部分(解引用 x)只有在 x 不是空指针时才被评估。" 这是一个很好的例子。 - Jack

5

它正在执行按位与操作。

它所做的是表达式i == 4等同于1,如果i4,对于RHS(显然是j9),也是如此。 &运算符返回两个操作数都有该位的数字。

它的工作方式与&&相同,因为00000001 & 00000001(缩小到一个字节的示例)相同。如果其中一个是0(条件为false),那么&将不会看到两个操作数都打开的两个位,并且00000000虚假的

然而,不要仅仅使用&因为它比较短一个字符。使用它是因为它表达了你想要实现的内容。如果你需要逻辑上的AND,使用&&
对于|同样适用,只不过它会在任一操作数打开该位时将其打开,而不是每个操作数都打开该位时才会生成结果位。

2

单个&符号代表按位与操作。只有当两个操作数在同一位置都为1时,才会将结果中的每个位设置为1。

由于C语言中的比较运算返回true则为1,false则为0,所以只要两个操作数都是比较运算,&&& 的结果相同。但对于任意值,它将返回似乎随机的结果。例如,1 && 2 是true,但是 1 & 2 是false,因为1和2的二进制表示中没有共同的位。


0

单个和号称为按位与。它是一种二进制运算符,逐位“与”两个数字。

例如,如果您有两个二进制数01100010和00011111,则按位与将得到00000010

i==4返回1(true),j==9也是如此。因此,i==4 & j==9实际上只是1 & 1,评估为1(true)。

尝试这些示例以查看差异

1)int k = 4 & 6; vs int k = 4 && 6;

2)if(i==4 && 2) vs if(i==4 & 2)


如果我在上面的示例中只有一个和号,会发生什么?"i==4 & j==9"是如何工作的? - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接