短路:如果发生短路,我该如何写?

时间:2015-10-29 22:26:47

标签: if-statement pseudocode short-circuiting

  

是否可以用支持短路的语言编写单行if then else语句?它不必是语言特定的,只是伪代码。

如果您不知道,短路意味着语言将通过首先执行exp1 || exp2 || exp3 || exp4...是||运算符)来评估 strong> or,如果它返回true,执行 exp 1,依此类推......但是,当exp 2返回false时,它不会继续评估exp n以及之后的任何内容。

3 个答案:

答案 0 :(得分:1)

让我们说你想表达:

if p then f() else g()

仅使用||和&&都是短路的。你可以这样做:

(p && ( f() || 1 )) || g()

要测试它,快速编写脚本:

$ perl -E '$p=1; ($p && ( f() || 1 )) || g(); sub f { say "f() called" } sub g { say "g() called" }'
f() called
$ perl -E '$p=0; ($p && ( f() || 1 )) || g(); sub f { say "f() called" } sub g { say "g() called" }'
g() called
$ 

答案 1 :(得分:0)

在C,C ++,C#和Java中,你可以这样做(所有4个支持短路):

a = a>b ? a : b;

这会将a分配给ab中的较大者。

这称为ternary operator。首先是条件来测试a>b,然后是问号,然后是true值(例如a),然后是冒号,然后是false值(例如{{ 1}})。

答案 2 :(得分:0)

你不能只是简短的电路。这意味着通过在第一个条件之后跳过所有条件来缩短所评估条件的数量,这些条件将构成整个条件"com.foo.FooModule""com.super.foo.SuperFooModule"(基于运算符)。

E.g:

public static void main(String[] args) {
  Config config = parseConfig(args);
  List<Module> modules = new ArrayList<>();
  modules.add(...); // application modules

  String fooModuleName = config.get("foo_module");
  Class<? extends Module> moduleClass =
      Class.forName(fooModuleName).asSubclass(Module.class);
  modules.add(moduleClass.newInstance());

  Injector injector = Guice.createInjector(modules);
  injector.getInstance(MyApplication.class).run();
}

true评估不会检查false的值,因为boolean x = true || 1 == 2; 已经使||成为真,无论如何。

1 == 2类似:

true

为了扩展一点,我可以写:

||

在任何一种情况下,条件的后半部分都不会被检查(并且func()不会被调用),因为前半部分给出了&&

只有这种行为才有办法boolean y = 2 < 3 && 5 > 6;