开发者

Logical operators: (A>=100 && B<100 || B<A)

is the expr开发者_StackOverflow社区ession alright?

(A>=100 && B<100 || B<A)

I am not sure whether there should not be:

(A>=100 && (B<100 || B<A))

I need to say that when A>=100 AND (B<100 OR B < A).


What you're talking about is operator precedence. The AND symbol has a higher precedence than OR, so in your first example the AND is calculated first. If you want the OR to be calculated first then, yes, you should include the parenthesis.


A>=100 && B<100 || B<A doesn't make sense: it's equal to just B<A.

A>=100 && (B<100 || B<A) also doesn't make sense: it's equal to just A>=100 && B<A.


Well, actually:

(A>=100 && (B<100 || B<A))

is the same as:

(A>=100 && B<A)

That's because, if B < 100, it's automatically less than A since A >= 100 and here's the code that proves it (in C but C# should be the same):

#include <stdio.h>
static void test (int a, int b) {
    printf ("a=%3d, b=%3d : ok=%d\n", a, b,
        (a>=100 && (b<100 || b<a)) == (a>=100 && b<a));
}
int arr[] = {1,2,3,99,100,101,199,200,201};

int main (void) {
    int i, j;
    for (i = 0; i < sizeof(arr)/sizeof(*arr); i++) {
        for (j = 0; j < sizeof(arr)/sizeof(*arr); j++) {
            test (arr[i], arr[j]);
        }
    }
    return 0;
}

It outputs:

a=  1, b=  1 : ok=1
a=  1, b=  2 : ok=1
a=  1, b=  3 : ok=1
a=  1, b= 99 : ok=1
a=  1, b=100 : ok=1
a=  1, b=101 : ok=1
a=  1, b=199 : ok=1
a=  1, b=200 : ok=1
a=  1, b=201 : ok=1
a=  2, b=  1 : ok=1
a=  2, b=  2 : ok=1
a=  2, b=  3 : ok=1
a=  2, b= 99 : ok=1
a=  2, b=100 : ok=1
a=  2, b=101 : ok=1
a=  2, b=199 : ok=1
a=  2, b=200 : ok=1
a=  2, b=201 : ok=1
a=  3, b=  1 : ok=1
a=  3, b=  2 : ok=1
a=  3, b=  3 : ok=1
a=  3, b= 99 : ok=1
a=  3, b=100 : ok=1
a=  3, b=101 : ok=1
a=  3, b=199 : ok=1
a=  3, b=200 : ok=1
a=  3, b=201 : ok=1
a= 99, b=  1 : ok=1
a= 99, b=  2 : ok=1
a= 99, b=  3 : ok=1
a= 99, b= 99 : ok=1
a= 99, b=100 : ok=1
a= 99, b=101 : ok=1
a= 99, b=199 : ok=1
a= 99, b=200 : ok=1
a= 99, b=201 : ok=1
a=100, b=  1 : ok=1
a=100, b=  2 : ok=1
a=100, b=  3 : ok=1
a=100, b= 99 : ok=1
a=100, b=100 : ok=1
a=100, b=101 : ok=1
a=100, b=199 : ok=1
a=100, b=200 : ok=1
a=100, b=201 : ok=1
a=101, b=  1 : ok=1
a=101, b=  2 : ok=1
a=101, b=  3 : ok=1
a=101, b= 99 : ok=1
a=101, b=100 : ok=1
a=101, b=101 : ok=1
a=101, b=199 : ok=1
a=101, b=200 : ok=1
a=101, b=201 : ok=1
a=199, b=  1 : ok=1
a=199, b=  2 : ok=1
a=199, b=  3 : ok=1
a=199, b= 99 : ok=1
a=199, b=100 : ok=1
a=199, b=101 : ok=1
a=199, b=199 : ok=1
a=199, b=200 : ok=1
a=199, b=201 : ok=1
a=200, b=  1 : ok=1
a=200, b=  2 : ok=1
a=200, b=  3 : ok=1
a=200, b= 99 : ok=1
a=200, b=100 : ok=1
a=200, b=101 : ok=1
a=200, b=199 : ok=1
a=200, b=200 : ok=1
a=200, b=201 : ok=1
a=201, b=  1 : ok=1
a=201, b=  2 : ok=1
a=201, b=  3 : ok=1
a=201, b= 99 : ok=1
a=201, b=100 : ok=1
a=201, b=101 : ok=1
a=201, b=199 : ok=1
a=201, b=200 : ok=1
a=201, b=201 : ok=1

But, if those were just general items rather than specific ones, && has a higher precedence than || in C#, so you should use:

(A>=100 && (B<100 || B<A))


A>=100 && B<100 || B<A

is the implicit version of :

(A>=100 && B<100) || B<A

as the && operator has more priority than ||


Basically no...

and (&&) has - or at least should have - precedence over or (||) - but regardless if there is any possibility of doubt write the expression in such a way that your are clear to the reader (and therefore to the compiler) about your intent.

To which end if you mean:

If A >= 100 and then if B < 100 or B < A you have to write

(A>=100 && (B<100 || B<A)) 

However in this specific example the B < 100 is redundant - which is, I think causing further confusion, all you need is

(A>=100 && B<A) 


(A >= 100 && B < 100 || B < A) is the same as ((A >= 100 && B<100) || B < A)

In this case, this will be true, in two cases:

1) A >= 100 and B < 100 (note, B < A automatically follows)

2) B < A < 100

(A >= 100 && (B < 100 || B < A))

This one will be true if

1) A is above 100 AND

2) B is below A

ie,. this is the same as (A >= 100 && B < A) (but B doesn't have to be below 100)


Do not you think this?

(A=<100 && B>100 || B<A)

I think there is typo in the OP questions

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜