【问题标题】:Ternary operator for comparsion not giving accurate result [closed]用于比较的三元运算符没有给出准确的结果[关闭]
【发布时间】:2015-02-13 15:55:01
【问题描述】:

我正在使用三元运算符进行比较和计算,但它没有给出预期的结果。 我错过了什么或做错了什么?

int x = 600000;
x = (x > 250000 && x < 500000 ? 
        (x > 500000 && x < 1000000 ? 
            (x > 1000000 ? 
                x = (x / 100) * 30 : 
                x = (x / 100) * 20) : 
            x = (x / 100) * 10):
        x);

我想实现这个:

if (x > 250000 && x < 500000)
{
    x = (x / 100) * 10;
}
else if (x > 500000 && x < 1000000)
{
    x = (x / 100) * 20;
}
else if (x > 1000000)
{
    x = (x / 100) * 30;
}

【问题讨论】:

  • 在这种情况下,if 块更具可读性,我不会为复杂的三元运算符而烦恼,而只需我的 2 美分。
  • 如果您以相反的顺序检查它,您将不必验证上限
  • 为什么要扼杀可读性?你也知道上面的逻辑有漏洞。如果 in 是 500000 或 1000000,那么您的 ITE 将永远不会正确。
  • 这个问题似乎是题外话,因为它是关于“改进”工作代码。
  • 我只是好奇:为什么“某些引擎”不能使用“if”?听起来很奇怪,它不“支持”“如果”——它看起来更像是老师强加的约束。

标签: c# ternary-operator


【解决方案1】:
x = (x > 250000 && x < 500000) ? (x / 100) * 10 : ((x > 500000 && x < 1000000) ? (x / 100) * 20 : ((x > 1000000) ? (x / 100) * 30 : x));

(conditional) ? expr1 : expr2 形式的三元运算符应读作if conditional then expr1 otherwise expr2

【讨论】:

    【解决方案2】:

    让我首先警告您,通常不会规定像这样的长三元运算,因为如果有任何修改,它只会在将来引起问题。不过,以下将满足要求:

    int x = 600000;
    x = (x > 250000 && x < 500000) ? ((x / 100) * 10): ((x > 500000 && x < 1000000) ? ((x / 100) * 20): (x > 1000000) ? ((x / 100) * 30):x);
    

    【讨论】:

      【解决方案3】:

      您将if-then-else 级联错误。 else ifelse 的一部分。因此表达式为:

      x = (x > 250000 && x < 500000) ?
          (x / 100) * 10 :
          ((x > 500000 && x < 1000000) ?
              (x / 100) * 20 :
              ((x > 1000000) ?
                  (x / 100) * 30 ) :
                  x
              )
          )
      );
      

      但我不明白为什么要对如此复杂的语句使用三元运算符。它们不会产生任何性能提升。三元运算符主要用于没有(或不多)级联的小表达式。

      背景信息

      else if 实际上是一个if 级联成else 因此:

      if (x > 250000 && x < 500000) {
          x = (x / 100) * 10;
      }
      else if (x > 500000 && x < 1000000) {
          x = (x / 100) * 20;
      }
      else if (x > 1000000) {
          x = (x / 100) * 30;
      }
      

      其实是这样的:

      if (x > 250000 && x < 500000) {
          x = (x / 100) * 10;
      }
      else {
          if (x > 500000 && x < 1000000) {
              x = (x / 100) * 20;
          }
          else {
              if (x > 1000000) {
                  x = (x / 100) * 30;
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果你缩进你的代码,它会让你更容易看到发生了什么

        x = (x > 250000 && x < 500000
                ? (x > 500000 && x < 1000000
                    ? (x > 1000000
                        ? x = (x / 100) * 30
                        : x = (x / 100) * 20)
                    : x = (x / 100) * 10)
                :x);
        

        这转换为以下if-else 语句:

        if (x > 250000 && x < 500000)
        {
            if (x > 500000 && x < 1000000)
            {
                if (x > 1000000)
                {
                    x = (x / 100) * 30;
                }
                else
                {
                    x = (x / 100) * 20;
                }
            }
            else
            {
                x = (x / 100) * 10;
            }
        }
        else
        {
            x = x;
        }
        

        很明显,如果满足x &gt; 250000 &amp;&amp; x &lt; 500000,那么它将永远不会到达第二个 if 语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-07
          • 1970-01-01
          • 1970-01-01
          • 2020-08-23
          • 2020-12-05
          • 2023-03-20
          • 1970-01-01
          • 2013-03-09
          相关资源
          最近更新 更多