【问题标题】:Short Circuiting: How would I write if then else with short-circuiting?短路:如果发生短路,我该怎么写?
【发布时间】:2016-01-30 06:32:19
【问题描述】:

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

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

【问题讨论】:

标签: if-statement pseudocode short-circuiting


【解决方案1】:

在 C、C++、C# 和 Java 中,您可以这样做(所有 4 种都支持短路):

a = a>b ? a : b;

这将分配a 两者中较大的一个,ab

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

【讨论】:

  • 我会说你不能;你用的是不同的运营商,你不是在这里吗?而且,顺便说一句,短路在哪里?
  • @watery - 在 C、C++、C# 和 Java 中,会自动发生短路。
  • 我知道,我的意思是我不明白在你的例子中短路可能发生在哪里。
  • @watery 我猜三元运算符的短路意味着 ?被执行或 : 之后的部分,但不能同时执行。如果您想到像 a>b 这样的例子可能会更清楚? f() : g() - f() 或 g() 被调用,但不能同时调用。
  • @asjo 我仍然看不到那里的短路:据我了解,这就是三元运算符的行为方式,并且该行为不依赖于语言中可用的短路电路。跨度>
【解决方案2】:

你不能简单地短路。这意味着通过跳过第一个条件之后的所有条件来缩短评估条件的数量,这将使整个条件 truefalse(基于运算符)。

例如:

boolean x = true || 1 == 2;

|| 评估不会检查1 == 2 的值,因为true 已经将|| 设为true,无论接下来发生什么。

&& 采用类似的方式:

boolean y = 2 < 3 && 5 > 6;

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

boolean y = 2 < 3 && 5 > func();

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

没有办法做某事else,只有这种行为。

【讨论】:

  • 如果你可以同时使用 ||和&&,你可以。
【解决方案3】:

假设你想表达:

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
$ 

【讨论】:

  • 很有趣,但是如果 ptruef()false 怎么办?不会评估 g() 吗?
  • @watery 是的,你是对的,它应该说 ( f() || 1 ) - 我会解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2013-08-23
  • 2015-10-16
  • 2016-09-17
  • 2016-03-29
相关资源
最近更新 更多