【问题标题】:Logical operators: (A>=100 && B<100 || B<A)逻辑运算符: (A>=100 && B<100 || B<A)
【发布时间】:2011-03-28 19:01:06
【问题描述】:

表达好吗?

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

我不确定是否应该有:

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

我需要说,当 A>=100 AND (B

【问题讨论】:

  • 从您的问题中不清楚您要测试什么条件 - 是第二个吗? (你说'是否应该存在')。
  • 你应该给出一些 A 和 B 的可能值的例子,以及你的预期输出。另外,请注意 a&gt;=100, b&lt;100 -> b&lt;a (虽然这不是你写的 - || 确实允许更多情况)。
  • 我再说一遍,更清楚 - 代码令人困惑,“纯文本”解释也不是更好 - 它们都是模棱两可的 - 我们无法理解你的意思 /b>,所以你不能得到正确的答案。
  • 更改了英文位以使其明确。我很确定这是想要的,因为第二个代码位说明了它(如果我错了,OP 可以将其更改为另一个 - 我只是想消除歧义)。
  • @paxdiablo - 你怎么知道你的编辑是正确的?恐怕我们没有足够的数据来“消除歧义”——只有三个可能是错误的版本。

标签: c# operators


【解决方案1】:

您所说的是运算符优先级。 AND 符号的优先级高于 OR,因此在您的第一个示例中,首先计算 AND。如果您希望先计算 OR,那么,是的,您应该包含括号。

【讨论】:

    【解决方案2】:
    A>=100 && B<100 || B<A
    

    是 :

    的隐式版本
    (A>=100 && B<100) || B<A
    

    因为 && 运算符的优先级高于 ||

    【讨论】:

      【解决方案3】:

      其实:

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

      等同于:

      (A>=100 && B<A)
      

      那是因为,如果 B &lt; 100,它会自动小于 A,因为 A &gt;= 100 并且这是证明它的代码(在 C 中,但 C# 应该是相同的):

      #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;
      }
      

      它输出:

      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
      

      但是,如果这些只是一般项目而不是特定项目,&amp;&amp; 在 C# 中的 higher precedence 而不是 ||,因此您应该使用:

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

      【讨论】:

      • 试试看。如果 a = 100 且 b
      • 不是真的,如果A=1000, B=500(A&gt;=100 &amp;&amp; (B&lt;100 || B&lt;A)) = true 而是(A&gt;=100 &amp;&amp; B&lt;100) = false。但是,对于(A&gt;=100 &amp;&amp; B&lt;A),它以另一种方式工作。
      • 对,应该会更好,这次我检查过了:-)
      【解决方案4】:

      基本上没有……

      and (&&) 具有 - 或至少 应该 具有 - 优先于 or (||) - 但无论是否有任何疑问的可能性,请以您清楚的方式编写表达式向读者(以及因此向编译器)传达您的意图。

      如果你的意思是到哪一步:

      如果 A >= 100 然后如果 B

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

      但是在这个具体的例子中,B

      (A>=100 && B<A) 
      

      【讨论】:

        【解决方案5】:

        (A >= 100 && B = 100 && B

        在这种情况下,这将是正确的,在两种情况下:

        1) A >= 100 且 B

        2) B

        (A >= 100 && (B

        如果

        1) A 大于 100 并且

        2) B 低于 A

        即,。这与 (A >= 100 && B

        【讨论】:

          【解决方案6】:

          A&gt;=100 &amp;&amp; B&lt;100 || B&lt;A 没有意义:它等于 B&lt;A

          A&gt;=100 &amp;&amp; (B&lt;100 || B&lt;A) 也没有意义:它等于 A&gt;=100 &amp;&amp; B&lt;A

          【讨论】:

            【解决方案7】:

            你不这么认为吗?

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

            我认为 OP 问题中有错字

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-06-13
              • 2015-11-14
              • 2013-06-13
              • 2011-05-13
              • 1970-01-01
              • 2021-11-28
              • 1970-01-01
              相关资源
              最近更新 更多