有时我想要做这样的事情(其中i和j是整数)。
(if i==4 && j==9)
{
...
}
如果i等于4且j等于9,则它将通过括号。我一直使用单个&而不是双个&,我的代码一直在编译和运行。
它是否与双个&&执行相同的操作?如果不是,它一直在做什么?
编辑:哦,我也一直在使用“或”,使用“|”代替“||”。
(if i==4 && j==9)
{
...
}
如果i等于4且j等于9,则它将通过括号。我一直使用单个&而不是双个&,我的代码一直在编译和运行。
它是否与双个&&执行相同的操作?如果不是,它一直在做什么?
编辑:哦,我也一直在使用“或”,使用“|”代替“||”。
if (i==4 && j==9)
。&&
更改为 &
不应该改变太多。最大的变化是,使用 &&
时,只有当 i==4
部分为真时,才会评估 j==9
,但是使用 &
,无论如何都会评估两者。if (x != NULL && x->whatever ...)
的情况时,您需要确保仅在 x
不是空指针时才评估第二部分(解引用 x
)。但是,在您的情况下,比较看起来像 int
是不太可能产生任何问题的。1
以外的值以表示 true
的内容时,也可能遇到问题。同样,在此处不是问题,因为 ==
将始终产生 0
或 1
。例如,如果您使用 <ctype.h>
中的 isalpha
、islower
等,则它们仅需要产生 0
或非零值。如果将其与 &
结合使用,则会得到位运算的 or
,这可能会对两个非零输入产生 0(例如,1 & 2 == 0
,但是 1 && 2 == 1
)。==
的结果上使用按位 and
时,您将获得 0 & 0
、0 & 1
、1 & 0
或 1 & 1
。 1 & 1
将产生 1
(真)。所有其他情况都将产生 0(假),就像 &&
一样。它正在执行按位与操作。
它所做的是表达式i == 4
等同于1
,如果i
是4
,对于RHS(显然是j
和9
),也是如此。 &
运算符返回两个操作数都有该位的数字。
它的工作方式与&&
相同,因为00000001 & 00000001
(缩小到一个字节的示例)相同。如果其中一个是0
(条件为false),那么&
将不会看到两个操作数都打开的两个位,并且00000000
是虚假的。
&
因为它比较短一个字符。使用它是因为它表达了你想要实现的内容。如果你需要逻辑上的AND,使用&&
。|
同样适用,只不过它会在任一操作数打开该位时将其打开,而不是每个操作数都打开该位时才会生成结果位。单个&符号代表按位与操作。只有当两个操作数在同一位置都为1时,才会将结果中的每个位设置为1。
由于C语言中的比较运算返回true则为1,false则为0,所以只要两个操作数都是比较运算,&
与 &&
的结果相同。但对于任意值,它将返回似乎随机的结果。例如,1 && 2
是true,但是 1 & 2
是false,因为1和2的二进制表示中没有共同的位。
单个和号称为按位与。它是一种二进制运算符,逐位“与”两个数字。
例如,如果您有两个二进制数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)