代码之家  ›  专栏  ›  技术社区  ›  Tim Lytle

为什么使用短路代码?

  •  5
  • Tim Lytle  · 技术社区  · 15 年前

    相关问题 : Benefits of using short-circuit evaluation , Why would a language NOT use Short-circuit evaluation? , Can someone explain this line of code please? (Logic & Assignment operators)

    有人对使用短路代码的语言的好处有疑问,但我想知道程序员的好处是什么?只是为了让代码更简洁一点?还是有性能原因?

    我不想问两个实体需要评估的情况,例如:

    if($user->auth() AND $model->valid()){
      $model->save();
    }
    

    对我来说,原因很清楚,因为这两个都需要是真的,如果用户不能保存数据,您可以跳过成本更高的模型验证。

    这也有一个(对我来说)明显的目的:

    if(is_string($userid) AND strlen($userid) > 10){
      //do something
    };
    

    因为打电话是不明智的 strlen() 具有非字符串值。

    我想知道的是,当短路代码不影响任何其他语句时,它的使用。例如,从Zend应用程序默认索引页:

    defined('APPLICATION_PATH')
     || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    

    这可能是:

    if(!defined('APPLICATION_PATH')){
      define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    }
    

    或者即使是一句话:

    if(!defined('APPLICATION_PATH'))
      define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    

    那么为什么要使用短路代码呢?仅仅为了使用逻辑运算符代替控制结构的“凉爽”因素?合并嵌套的if语句?因为它更快?

    9 回复  |  直到 12 年前
        1
  •  4
  •   JRL    15 年前

    对于程序员来说,与其他更详细的语法相比,更详细的语法的好处是:

    • 更少的类型,因此更高的编码效率
    • 更少的可读性,因此更好的可维护性。

    现在,我只谈论那些不那么冗长的语法在任何方面都不复杂或不聪明的时候,就像人们认识到的那样,只是用更少的字符。

    通常情况下,当你看到一种语言中的特定结构时,你希望你使用的语言能够拥有,但以前甚至不一定要实现它。我头脑中的一些例子:

    • Java中的匿名内部类,而不是传递函数的指针(更多的代码行)。
    • 在Ruby中,运算符,用于计算表达式的值,并在其值为false或为空时将其赋值。当然,你可以用3行代码来实现同样的事情,但是为什么呢?
    • 还有更多…
        2
  •  4
  •   rlbond    15 年前

    用它来迷惑人们!

        3
  •  4
  •   Dan    15 年前

    我不知道php,在C语言家族中,我从来没有见过在if或while条件之外使用过短路,但是在Perl中,说:

    open my $filehandle, '<', 'filename' or die "Couldn't open file: $!";
    

    在一个语句中使用它的一个优点是变量声明。否则你必须说:

    my $filehandle;
    unless (open $filehandle, '<', 'filename') {
        die "Couldn't open file: $!";
    }
    

    很难说第二个更干净。在一种没有的语言中,它会更加冗长。 unless

        4
  •  2
  •   jprete    15 年前

    我认为你的例子是关于凉爽的因素。没有理由写这样的代码。

    编辑:因为惯用的原因,我不介意这样做。如果使用一种语言的每个人都使用短路评估来做出每个人都能理解的类似于语句的实体,那么您也应该这样做。然而,我的经验是,这种类型的代码很少用C族语言编写;正确的形式只是将“if”语句作为普通语句使用,它将条件(可能没有副作用)与条件控件(可能有许多副作用)的函数调用分开。

        5
  •  2
  •   Tim Palak Chaudhary    15 年前

    在两种尚未提及的重要情况下,短路操作器是有用的:

    案例1 .假设你有一个指针,可能是,也可能不是。 NULL 你想检查一下 无效的 它所指的不是 0 . 然而,你 必须 如果指针为空,则不取消对它的引用。如果没有短路操作员,则必须执行以下操作:

    if (a != NULL) {
      if (*a != 0) {
        ⋮
      }
    }
    

    但是,短路运算符允许您更紧凑地编写:

    if (a != NULL && *a != 0) {
      ⋮
    }
    

    在某种程度上, *a 如果 a 无效的 .

    案例2 . 如果要将变量设置为从一系列函数之一返回的非假值,只需执行以下操作:

    my $file = $user_filename ||
               find_file_in_user_path() ||
               find_file_in_system_path() ||
               $default_filename;
    

    这将设置 $file $user_filename 如果它存在,或者 find_file_in_user_path() ,如果是真的,或者等等。这在Perl中可能比在C中更常见,但我在C中见过。

    还有其他的用途,包括上面提到的那些相当做作的例子。但它们是一个有用的工具,在用不太复杂的语言编程时我忽略了它。

        6
  •  1
  •   regjo    15 年前

    与丹所说的有关,我认为这一切都取决于每种编程语言的约定。我看不出有什么不同,所以在每种编程语言中做任何惯用的事情。有一件事会让人想起,如果你必须做一系列的检查,在这种情况下,短路的风格会比替代的如果风格更清楚。

        7
  •  0
  •   Poindexter    15 年前

    如果您有一个昂贵的调用(性能方面的)函数,该函数在右边返回了一个布尔值,而您只希望在另一个条件为真(或假)时调用该布尔值,该怎么办?在这种情况下,短路可以节省许多CPU周期。它确实使代码更简洁,因为嵌套的if语句更少。所以,出于你在问题末尾列出的所有原因。

        8
  •  0
  •   Excalibur2000    15 年前

    事实上,这就是表演。在编译器中使用短路来消除文件大小和执行速度上的死代码保存。在运行时,如果短路的结果不影响答案,则不会执行逻辑表达式中的剩余子句,从而加快公式的计算速度。我正在努力记住一个例子。例如

    A、B、C

    这个公式中有两个项是从左到右计算的。

    如果a和b的计算结果为false,那么下一个表达式和c可以是false和true,也可以是false和false。无论C的值是多少,两者都会被评估为假。因此,编译器在编译格式中不包含C,因此会使代码短路。

    为了回答这个问题,有些特殊情况下编译器无法确定逻辑表达式是否有常量输出,因此不会使代码短路。

        9
  •  0
  •   Mario S    12 年前

    这样想,如果你有这样的陈述

    if( A AND B )
    

    如果A的返回值为假,那么您可能只想在极少数的特殊情况下评估B。因此,不使用简短的ciruit评估是令人困惑的。

    短路评估还可以通过防止另一个加括号的缩进来提高代码的可读性,并且括号有累积的趋势。