Applied to integral primitive operands, & is a "bitwise and" operator. Applied to boolean operands, & is a "logical and" operator.
The && operator is a short-circuiting "logical and" operator that can be applied only to booleans. If the left operand evaluates to false, then the expression's result is already known (because the result is false regardless of the right operand's value), and so the operation "short circuits" and does not evaluate the right operand. In other words, the right operand evaluates only if the left operand evaluates to true.
"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer sscce.org
Just use && all the time right? It's more efficient since it doesn't evaluate the right side if the left side is false. Well, try running the following code, and then run it again and change & to && to see the difference:
Sometimes you might want the right side to evaluate regardless of what the left side evaluates to. [ October 27, 2006: Message edited by: sven studde ]