Reputation: 29831
We get into unnecessary coding arguments at my work all-the-time. Today I asked if conditional AND (&&) or OR (||) had higher precedence. One of my coworkers insisted that they had the same precedence, I had doubts, so I looked it up.
According to MSDN AND (&&) has higher precedence than OR (||). But, can you prove it to a skeptical coworker?
http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx
bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as
bool result = false || (true && false); // --> false
So my question is how do you prove with code that AND (&&) has a higher precedence that OR (||)? If your answer is it doesn't matter, then why is it built that way in the language?
Upvotes: 90
Views: 75340
Reputation: 9020
false || true && true
Yields: true
false && true || true
Yields: true
Upvotes: 3
Reputation: 7208
Change the first false by true. I know it seems stupid to have (true || true) but it proves your point.
bool result = true || true && false; // --> true
result = (true || true) && false; // --> false
result = true || (true && false); // --> true
Upvotes: 147
Reputation: 63435
If you really want to freak him out try:
bool result = True() | False() && False();
Console.WriteLine("-----");
Console.WriteLine(result);
static bool True()
{
Console.WriteLine(true);
return true;
}
static bool False()
{
Console.WriteLine(false);
return false;
}
This will print:
True
False
False
-----
False
In response to the comment:
In C#, |
is a logical operator that performs the same boolean logic as ||
, but does not short-circuit. Also in C#, the |
operator has a higher precedence than both ||
and &&
.
By printing out the values, you can see that if I used the typical ||
operator, only the first True
would be printed - followed by the result of the expression which would have been True
also.
But because of the higher precedence of |
, the true | false
is evaluated first (resulting in true
) and then that result is &&
ed with false
to yield false
.
I wasn't trying to show the order of evaluation, just the fact that the right half of the |
was evaluated period when it normally wouldn't be :)
Upvotes: 15
Reputation: 679
You cannot just show the end result when your boolean expressions are being short-circuited. Here's a snippet that settles your case.
It relies on implementing & and | operators used by && and ||, as stated in MSDN 7.11 Conditional logical operators
public static void Test()
{
B t = new B(true);
B f = new B(false);
B result = f || t && f;
Console.WriteLine("-----");
Console.WriteLine(result);
}
public class B {
bool val;
public B(bool val) { this.val = val; }
public static bool operator true(B b) { return b.val; }
public static bool operator false(B b) { return !b.val; }
public static B operator &(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
return new B(lhs.val & rhs.val);
}
public static B operator |(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
return new B(lhs.val | rhs.val);
}
public override string ToString() {
return val.ToString();
}
}
The output should show that && is evaluated first before ||.
True & False
False | False
-----
False
For extra fun, try it with result = t || t && f and see what happens with short-circuiting.
Upvotes: -5
Reputation: 13028
You don't prove it with code but with logic. AND is boolean multiplication whereas OR is boolean addition. Now which one has higher precedence?
Upvotes: 5
Reputation: 12509
Wouldn't this get you what you're after? Or maybe I'm missing something...
bool result = true || false && false;
Upvotes: 6