简体   繁体   中英

What is the meaning of (true && false || true) in C#?

If I have this equation:

    var x = (true && false || true)

Is that equivalent to:

    var x = ((true && false) || true)

or:

    var x = (true && (false || true))

And whats the logic behind this?

AND wins over OR.

So it will be

var x = ((true && false) || true)

See Operator precedence and associativity .

In boolean logic, "not" ( ! ) is evaluated before "and" ( && ) and "and" is evaluated before "or" ( || ). By using the double ( && ) and the double ( || ), these operators will short circuit, which does not affect the logical outcome but it causes terms on the right hand side to not be evaluated if needed.

Thus

var x = (true && false || true) evaluates to false|| true false|| true which evaluates to true

and

var x = ((true && false) || true) evaluates to false || true false || true which evaluates to true

and

var x = (true && (false || true)) evaluates to true && true which evaluates to true

I believe it's

var x = ((true && false) || true)

...as && has precedence according to MSDN.

You'd think that whoever wrote that particular line of code might have made their intention clear by inserting the parenthesis in the right place. Do everyone else a favour, and add them in.

It's equivalent to

var x = ((true && false) || true)

The && operator has higher precedence than the || operator.

Operator precedence MSDN documentation

&& has higher precedence, so the second form (of the three) is correct. As to the logic, && tends to be vaguely associated with multiplication, and || with addition (if you use zero and non-zero to represent false and true, respectively, the operators have equivalent semantics). But mostly it's just the way it's been since C, and possibly before C.

If you use in this expression || true that mean doesn't matter about other result it always will be true

The above expression evaluates as ((true && false) || true) because of the operator precedence(&& has higher precedence than ||).

Check this link for more information on Operator Precedence: http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

&& has a higher precedence than || so the first two use cases will act exactly the same. The braces have no meaning here, just like in:

a * b + c = (a * b) + c

You can control precedence and associativity with braces. so the third use case will check the OR condition and then the AND.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM