Sometimes I want to do something like this (with i and j being ints).
(if i==4 && j==9)
{
...
}
Where it'll go through the brackets if i equals 4 and j equals 9. I've been using a single ampersand (&) instead of a double one and my code's been compiling and running.
Is it doing the same thing as a double ampersand &&, and if not what has it been doing?
Edit: Oh and I've been doing the same thing with or, using '|' instead of '||'
Presumably you mean if (i==4 && j==9)
.
Under the circumstances, changing this from &&
to &
shouldn't change much. The big thing that'll change is that with &&
, the j==9
would only be evaluated if the i==4
part was true, but with &
, they'll both be evaluated regardless.
When you have something like if (x != NULL && x->whatever ...)
you want to ensure that the second part (that dereferences x
) is only evaluated if x
is not a null pointer. In your case, however, comparing what appear to be int
s is unlikely to produce any problems.
It's also possible to run into a problem when you're dealing with something that may produce a value other than 1
to signal true
. Again, it's not a problem here because ==
will always produce either 0
or 1
. If (for example) you were using isalpha
, islower
, etc., from <ctype.h>
, they're only required to produce 0
or non-zero values. If you combined those with a &
, you'd get a bit-wise or
which could produce 0 for two non-zero inputs (e.g., 1 & 2 == 0
, but 1 && 2 == 1
).
When you use bitwise and
on the results from ==
, you're going to get 0 & 0
or 0 & 1
or 1 & 0
or 1 & 1
. 1 & 1
will yield 1
(true). All the others will yield 0 (false) --- just like &&
would have.
It's performing a bitwise AND.
What it's doing is the expression i == 4
is equivalent to 1
if i
is 4
and the same for the RHS (with j
and 9
, obviously). The &
operator returns the number where both operands have that bit on.
It works the same as &&
because 00000001 & 00000001
(slimmed down to a byte for example) is the same. If one is 0
(the condition was false), then the &
won't see two bits turned on for both operands, and 00000000
is 0
, which is falsey.
However, do not simply use &
because it's one character shorter or similar. Use it because it expresses what you want to achieve. If it's a logical AND you want, use &&
.
The same thing applies to |
, except instead of a resulting bit if each operand has it turned on, it turns it on if either operand has that bit turned on.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With