Consider
int a = 0;
int b = 0;
if((a == 1) && (b = 1) == 0){}
&& instead of & means, that if a != 1, IF returns false without ever
checking the second statement, whereas with
& both statements would be calculated
&& -> a = 0, b = 0
& -> a = 0, b = 1
Same with || and |. If the first statement is true || will ignore the
second statement, whereas | will check both.
So, for || and && you run the risk that initiations happening in the
second statements may or may not get done, but you will also benefit from
not having to done lengthy initiations if doesn't need to be done since
the if block would or wouldn't get executed anyway.