代码之家  ›  专栏  ›  技术社区  ›  Graviton

IsTree:TrueCondition:FalseCondition评估两个条件

  •  2
  • Graviton  · 技术社区  · 14 年前

    我发现了以下代码的一个非常令人费解的行为:

    public double ReturnBehavior(List<double> ptList)
    {
        return ptList.Count==0? 0:ptList[0];
    }
    

    我认为它应该等同于

    public double ReturnBehavior(List<double> ptList)
    {
        if(ptList.Count==0)
           return 0;
        return ptList[0];
    }
    

    但事实并非如此,因为第一种方法将同时评估 true false 条件在一起。所以这意味着第一个方法将尝试 IndexOutOfRange 例外如果 ptList.Count==0 .

    我是不是错过了什么?或者它是2008年的漏洞?

    3 回复  |  直到 14 年前
        1
  •  1
  •   desco    14 年前

    我在VS2010和VS2008中都检查过,行为是可以预料的-没有例外。如果您有错误-它们不在给定的代码片段中

        2
  •  0
  •   Marcelo Cantos    14 年前

    他们也应该这样做。三元运算符使用短路语义。如果测试通过,则只计算第一个表达式,否则只计算第二个表达式。你真的看到了例外吗?

        3
  •  -2
  •   scripni    14 年前

    我认为在某些情况下,如果您有多核处理器,编译器会告诉处理器在可能的情况下提前评估。至少我知道是这样的,比如我有一个 if(condition1 && condition2) 在某些计算机上,它将并行地评估这两个条件,这意味着即使第一个条件失败,它也会评估第二个条件。