|
And what's the case on the line of code in my first post?
|
|
|
|
|
Your case is an exception, don't treat it like a rule.
|
|
|
|
|
So are you admitting you were wrong?
I may or may not be responsible for my own actions
|
|
|
|
|
'AND' in VB is not equivalent to '&' in C#, but equivalent '&&'. this is applicable for OR also...
Only difference is 'AND' is not short circuited where '&&' is short circuited. To achieve short circuited and VB require explicit usage of 'AND ALSO'
|
|
|
|
|
But nobody here can understand why I continue to suggest we move from VB to C#.
Of course we want the default behavior to be as inefficient as possible!
|
|
|
|
|
In your example it's a waste of CPU cycles not to short circuit using &&. The exception is if you have somehow overloaded the & operator, or have logic in your Text property that needs to be evaluated every time.
|
|
|
|
|
http://msdn.microsoft.com/en-us/library/aa691306%28v=vs.71%29.aspx[^]
This (from Microsoft) includes & and | in the logical operators.
And semantics aside, they can and sometimes should be used as such in C# - for those cases where you want a logical operator without short-circuiting (i.e. one of the operands is a method call with side-effects - which would be a whole nother type of questionable practice, but the language allows it and it has is uses). So in that sense the OP is correct, & and && do the same thing except && short-circuits.
Of course, they don't do exactly the same thing, because & can also be used on non-boolean types as a bitwise operator. So (4 & 5) is meaningful, whereas 4 && 5 is not.
|
|
|
|
|
|
Fabio V Silva wrote: If you're working as C# developer I think you should RTFM.
No need to be impolite.
|
|
|
|
|
Fabio V Silva wrote: If you're working as C# developer I think you should RTFM.
You, sir, are a disgrace. Not only are you inaccurate in your assertions, you display the two traits I detest most about *some* people who work in this profession - a lack of respect for those around you, and a blinkered solipsism bordering on egomania.
Wise the f**k up son. Nobody's impressed.
|
|
|
|
|
Fabio V Silva wrote: They do the same except for the fact that && is short-circuited.
Except they don't do they? For boolean operands they do the same thing, (ignoring, as you said, the short circuiting which is a very good reason to use && ).
Take this example:
Console.WriteLine( 42 && 3);
Syntax error. Why? Because it is a Logical Operator which takes booleans as its operands.
Now take:
Console.WriteLine( 42 & 3)</pre>
Answer 2: Why? Because it is a Bitwise Logical Operator (though most people drop the "Logical") ANDing on the bits:
101010 AND
000011
------
000010
= 2.
The bitwise <code>|</code> and <code>&</code> operators are best left for work at the bit-level (such as bit-masking), whereas the the C# logical operators are better suited to boolean comparisons, like in the OP.
I wouldn't have voted you down BTW, but I would have pointed it out.
<div class="signature"><small><a href="http://tinyurl.com/3yl74on">Sort of a cross between Lawrence of Arabia and Dilbert.</a>[<a href="http://tinyurl.com/3yl74on" target="_blank" title="New Window">^</a>]<br>-Or-<br><a href="http://tinyurl.com/36qcqfr">A Dead ringer for Kate Winslett</a>[<a href="http://tinyurl.com/36qcqfr" target="_blank" title="New Window">^</a>]</small>
</div>
|
|
|
|
|
Really? And I always thought that '&&' was simply a short-circuited '&'. I must go RTFM.
|
|
|
|
|
You would think people would at least read it to confirm what they are saying if they are trying to disprove someone...
|
|
|
|
|
Fabio V Silva wrote: You would think people would at least read it to confirm what they are saying if they are trying to disprove someone...
I confirm before posting anything, check my reply.
|
|
|
|
|
As I have stated in my reply to Fabio, & and && are for different purpose. & is a bitwise operator and && is a logical operator, they may produce same output in certain situations, but it does not mean that you can use them interchangeably. In C#, logical operators always short-circuit.
See this link for an example:
http://blog.dmbcllc.com/2009/03/16/vs-and-vs-whats-the-difference/[^]
|
|
|
|
|
The && operator should be used instead of the & operator for clarity's sake because its the standard way of doing things. Also the && operator gives you some type safety that the & operator does not when dealing with LOGICAL ANDS: (4 && 5) will not compile but (4 & 5) will. If you are intending to perform a LOGICAL AND operation you could end up performing a LOGICAL BITWISE AND operation instead by mistake.
But in any case, the reason you are giving:
"(...)In C#, logical operators always short-circuit(...)
is so wrong I dont even know where to begin.
The operator & is an overloadable operator. Integral and boolean types have their own predefined & binary operators: &(int, int) computes the logical bitwise AND of its operands while &(bool, bool) computes the logical AND of its operands; that is, the result is true if and only if both its operands are true.
This is all straight from the C# specifications:http://msdn.microsoft.com/en-us/library/sbf85k1c.aspx[^]
So bool & bool is NOT A BITWISE OPERATION at all. Its a normal LOGICAL AND OPERATION where both terms are always evaluated contrary to bool && bool where the second term is evaluated if and only if the first term is true.
modified on Thursday, May 19, 2011 5:55 AM
|
|
|
|
|
Ha, that's what they taught me as well. It's utter nonsense off course since both '&' and '|' would be completely useless if that was the only difference.
It's just that it's a good habit to always use '&&' and '||' unless you need '&' or '|' specifically, even in cases where the result is the same.
|
|
|
|
|
This should really mess with your noggin:
bool isTrue = true || true && false;
bool isFalse = true | true && false;
Also, given your example, I'd prefer the double ampersand for 2 reasons: 1) for short-circuiting and 2) for standards' sake.
|
|
|
|
|
I was just discussing the case that someone said that line was incorrect and downvoted my answer when in reality I just copied the OP's line and changed the = to == which is what was actually stopping it from working as expected.
I prefer the double ampersand as well as a standard, the same way I always try to use short circuiting in VB which doesn't seem to be common practice, at least in online samples and articles.
|
|
|
|
|
Ahem!
The real Hall of Shame is the lack of brackets - pure laziness without realizing a simple misstyping mistiping mistyping can change the behaviour of code.
...most people are not a programming god who knows all precedence rules!
|
|
|
|
|
In the case you have posted the final result would be the same as if you had used the && operator. There is, however, an important difference between & and &&. Have a look at this example:
ICollection col = null;
if (col != null && col.Count > 0)
This would first check this expression: col != null; like it is false and we are using && operator, it would not even try to check the second operand, becouse the final result will be false. However, if we use just the bitwise & operator:
ICollection col = null;
if (col != null & col.Count > 0)
Since & operator is a bitwise operator it will try to check both operands so, in this case, it would throw a NullReferenceException when trying to evaluate the result of the second operand. That is why we always use the && operator in our boolean expressions, placing each operand in the right place. I guess this is what others have been trying to explain to you in this thread.
That said, I would not have downvoted your answer just for this if the rest of the answer is correct, and I think that not being able to make you understand this is not reason enough to tell them to RTFM.
|
|
|
|
|
Again, what makes you think I don't know the difference between & and &&?!
I never said they do the same thing and I do know that && is the most commonly used. That, however, does not make it wrong to use & between two boolean and it does not invalidate the fact that in that case it makes no difference. And if someone says it does then they should RTFM!
|
|
|
|
|
Fabio V Silva wrote: what makes you think I don't know the difference between & and &&?!
Oh, nothing at all but, you know, this is a public forum, and although there are many posts in this thread none of them was giving a good explanation about the differencies between those operators, becouse there are differencies, I know them, you know them and I know you know them, but a beginner might get confused after reading this thread. That's all.
|
|
|
|
|
|
forget it Keith, it's not gonna make any difference, I'm afraid you've just opened a can of worms.
|
|
|
|