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

编程:if的样式[关闭]

  •  -6
  • chris01  · 技术社区  · 6 年前

    让我们看看这个例子。

    List <String> lst = getSome ();  // returns null or a list
    if (lst == null || lst.contains ("bla") == true)
    {
       // go on
    

    这将起作用-捕捉空值。但这只是因为我知道if项是从左到右计算的,如果结果是不可更改的(1 x总是1),则它不会完全计算。至少这是我看到的如果我让它跑。

    但它不是第一眼就显现出来的,它可能取决于幕后的行为,而这种行为有时可能会改变。

    问题是:在一种允许这样做的语言中,这种风格好吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   potato    6 年前

    让我们看看这个例子:

    private static int personCount = 0;
    
    public static void main(String args[]) {
    
        boolean firstBool = false;
        if(addPerson(firstBool) || addPerson(true)){
            System.out.println("true");
        }
        System.out.println(personCount);
    }
    
    private static boolean addPerson(boolean b){
        personCount++;
        return b;
    }
    

    此代码输出 2 但如果你改变 firstBool true 它将输出 1 .

    有条件地执行第二个函数,这可能会让其他人忽略这样一个事实:这个函数不会总是第二次执行。如果这个函数不会影响if子句的结果之外的任何内容,那么它将是完美的,但是如果不这样做,最好避免编写这样的代码,或者至少添加一个关于它的注释。

    短路是一种优化,当一个人试图理解一段代码的功能时,他不必考虑后台发生的所有优化。

    编辑: 使用按位运算可以避免短路( & | )而不是逻辑操作( && || ,这样就可以确保始终执行这两个函数。