&& vs & and | vs ||… What’s the difference?

color-01 It seems like such a trivial thing to be talking about but not knowing the difference between the two operators can make a huge difference between working code and code that only seems to work.

Let me illustrate:

        bool b = false;
        bool c = true;
        if(b & c)
            // do something

        if(b && c)
            // do something

In the code above, both b & c and b && c evaluate to false, so  we are safe.  No problems.  But this leads us to believe that the following code is also safe:

        string s = null;
        if(s != null & s.Length > 0)
            // do something

        if(s != null && s.Length > 0)
            // do something

and this is what would get you in trouble.

The single ampersand and single pipe are knows as “bitwise operators.”  What this means in practical terms is that they will take whatever they find on BOTH sides of the operator and AND (&) or OR(|) them together.

So in the case of:

if(s != null & s.Length > 0)

s.Length > 0 will still get evaluated even if s is null.  Not exactly what we had in mind.

There is another side effect of bitwise operators that gets used very infrequently.  Because they are bitwise, I can use them on integers as well as boolean values.

int i= 5 & 6;

is a perfectly legal construct in CSharp.  It will AND all the bits that make up 5  (101) and all the bits that make up 4 (100) and store the result in i (4 or 100).

On the other hand, && and || are strictly used for boolean expressions and will evaluate as little of the expression as they can get away with.

This is why we can write:

        if(s != null && s.Length > 0)
            // do something

If s is null, we already know that the expression will fail, so there is no need to evaluate the string’s length.

And now for one of my favorite binary statements.

There are 10 types of people in the world.  Those who understand binary and those who don’t.

Related Post

  • jQuery Selectors – Looks just like CSSjQuery Selectors – Looks just like CSS Last week we took a look at the jQuery selector syntax, which allows us to select elements by their ID, class name, or tag name. While it is pretty cool that you can select by class name, that ...
  • using – There’s more there than you are usingusing – There’s more there than you are using If you've spent more than a day programming in CSharp, you have already discovered the need for the using directive: using System; using System.Collections.Generic; using System.Text.RegularExpr...
  • Readonly variables in CSharp? Really?!Readonly variables in CSharp? Really?! I'm sure most of you are familiar with the keyword "const," which allows you to declare a variable and give it a value and assures that no other code will change the value. const int v = 23; p...
  • CSharp fixed keywordCSharp fixed keyword Since I've already mentioned my bias against using unsafe mode in this post: Advanced CSharp - unsafe mode I'll skip my normal rant about that.  Just suffice it to say they don't call it "uns...
  • Advanced CSharp – yieldAdvanced CSharp – yield Have you ever had a situation arise where you want to create a function that returns a collection of results and you want the results to be listed in a for each loop?  Sure you have.  A...