Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a time when && (AndAlso) does not matter over & (And)

If I am evaluating two variables and not two method calls does it matter weather I use "&&" or "&"

//some logic that sets bool values

boolean X = true;
boolean Y = true;

if (X & Y){
   // perform some operation
}

if (X && Y){
   // perform some operation
}

Further a book I am using for C# 3.0 / .NET 3.5 only makes reference to the && operator, is the & operator going away?

like image 405
Bobby Borszich Avatar asked Nov 13 '08 04:11

Bobby Borszich


4 Answers

Always use && if you are performing a true/false logic test. A single & performs a bit-wise 'and'. It make work like a logic test in some cases but it is not guaranteed to work for all logic cases. The most common use of a single & is when applying a bit-mask.

Examples (&&):

true && true == true

Example (&):

00101001 & 00100001 = 00100001
like image 197
vfilby Avatar answered Oct 24 '22 06:10

vfilby


If you use a single & (And) the second part of the expression is evaluated. This could be bad if the second part relies on the first part being true. Usually always use && as the second part is not evaluated if the first part is false.

Logically the single & does a bitwise operation as others have said, which is still valid for boolean comparison/evaluation. Really the only time a single & (or |) should be used (or boolean evaluation) is if the second evaluation should always run (if it is a function call/modifier). This is bad practice through and probably why the book does not mention it.

Single & are useful with flag enums and bit masks.

The following will throw an exception of obj is null:

bool b = obj != null & obj.IsActive

But this will work:

bool b = obj != null && obj.IsActive

This is bad:

bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);

The & operator is here to stay.

like image 38
Robert Wagner Avatar answered Oct 24 '22 05:10

Robert Wagner


As has been observed, & is the bitwise AND operator. Raw binary math is seeming to be less and less common over time, with an increasing number of developers not really understanding bitwise arithmetic. Which can be a pain at times.

However there are a lot of tasks that are best solved with such, in particular anything that looks at data as flags. The & operator is 100% necessary, and isn't going anywhere - it simply isn't used as frequently as the boolean short-circuiting && operator.

For example:

[Flags]
enum SomeEnum { // formatted for space...
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ...
}
static void Main() {
    SomeEnum value = GetFlags();
    bool hasFoo = (value & SomeEnum.Foo) != 0;
}
static SomeEnum GetFlags() { ... }
like image 35
Marc Gravell Avatar answered Oct 24 '22 07:10

Marc Gravell


& is a bitwise operator while && is the AND operator. Two completely different operations.

int a = 1;
int b = 2;
assert (a & b == 0) 
assert (a && b == true) 

EDIT: Ooops...this example doesn't work in C#. It should in C++. Hopefully it illustrates the intent and the difference between the two operators.

like image 30
jpoh Avatar answered Oct 24 '22 05:10

jpoh