有时我想做这样的事情(i和j是整数)。
(if i==4 && j==9)
{
...
}
如果i等于4且j等于9,它将通过括号。我一直使用单个&符号(&)而不是double符号,我的代码已经编译并运行。
它是否与双号&&&&&&&&&&&&&&&&&
编辑:哦,我一直在做同样的事情或者,使用'|'而不是'||'
答案 0 :(得分:9)
大概你的意思是if (i==4 && j==9)
。
在这种情况下,将其从&&
更改为&
不应更改多。最重要的是,使用&&
时,只有j==9
部分为真,i==4
只有&
部分,而if (x != NULL && x->whatever ...)
部分才会被评估,它们都会被评估无论如何评估。
当你有类似x
之类的内容时,你想确保仅在x
不是空指针时才评估第二部分(解除引用int
)。但是,在您的情况下,比较看似1
的内容不太可能产生任何问题。
当您处理可能产生true
以外的值的信号==
时,也可能遇到问题。同样,这不是问题,因为0
将始终生成1
或isalpha
。如果(例如)您使用的islower
,<ctype.h>
等来自0
,则只需要生成&
或非零值。如果你将它们与or
组合在一起,你会得到一个有点1 & 2 == 0
,它可以为两个非零输入产生0(例如1 && 2 == 1
,但是and
)。
当您对==
的结果使用按位0 & 0
时,您将获得0 & 1
或1 & 0
或1 & 1
或{{1} }。 1 & 1
将产生1
(真)。所有其他人都会得到0(假)---就像&&
一样。
答案 1 :(得分:5)
正在执行bitwise AND。
如果i == 4
为1
,则表达式i
等同于4
,而对于RHS(j
和{{ 1}},显然)。 9
运算符返回两个操作数都具有该位的数字。
它的作用与&
相同,因为&&
(例如缩小到一个字节)是相同的。如果一个是00000001 & 00000001
(条件为假),那么0
将不会看到两个操作数都打开了两个位,而&
是00000000
,这是< EM> falsey
但,不要只使用0
,因为 一个字符或类似。使用它是因为它表达了您想要实现的目标。如果它是您想要的逻辑AND,请使用&
。
同样的事情适用于&&
,除非结果位如果每个操作数都打开,否则如果任一操作数打开该位,则将其打开。
答案 2 :(得分:2)
单个&符号按位AND。只有当两个操作数在该位置都有1时,才会设置结果的每一位。
由于C中的比较返回1表示为真,0表示假,&
将给出与&&
相同的结果,只要两个操作数都是比较。但对于任意值,它将返回看似随机的结果。 1 && 2
为真,但1 & 2
为假,因为1和2的二进制表示没有共同的位。
答案 3 :(得分:0)
单个&符号称为按位和。它是一个二进制运算符,可以逐位'和'两个数字。
例如,如果你有两个二进制数,01100010和00011111,你的按位并将导致00000010
i == 4返回1(真),j == 9。所以,我= = 4&amp; j == 9真的只是1&amp; 1,评估为1(真)。
尝试这些示例以查看差异
1)int k = 4&amp; 6; vs int k = 4&amp;&amp; 6;
2)if(i == 4&amp;&amp; 2)vs if(i == 4&amp; 2)