短路:如果短路,我怎么写?
Short Circuiting: How would I write if then else with short-circuiting?
Is it possible to write a one-line if then else
statement in a language that supports short-circuiting? It doesn't have to be language specific, just pseudocode.
如果你不知道,短路意味着语言将通过首先 执行计算 exp1 || exp2 || exp3 || exp4...
(||
是 or
运算符) exp 1
,那么如果returns为真,执行exp 2
,依此类推……然而,exp n
returns false,它不会继续评估 exp n+1
以及之后的任何内容。
在C、C++、C#和Java中,你可以这样做(所有4个都支持短路):
a = a>b ? a : b;
这将分配 a
两者中较大的一个,a
或 b
。
这叫做ternary operator
。首先是要测试的条件 a>b
,然后是问号,然后是 true
值(例如 a
),然后是冒号,然后是 false
值(例如 b
).
你不能简单地短路。这意味着通过跳过第一个条件之后的所有条件来缩短正在评估的条件的数量,这将使整个条件 true
或 false
(基于运算符)。
例如:
boolean x = true || 1 == 2;
||
计算不会检查 1 == 2
的值,因为 true
已经将 ||
变为真,无论后面是什么。
以类似的方式 &&
:
boolean y = 2 < 3 && 5 > 6;
为了进一步扩展,我可以这样写:
boolean y = 2 < 3 && 5 > func();
在任何一种情况下,都不会检查条件的后半部分(并且不会调用 func()),因为前半部分给出 false
.
没有办法做某事 else
,只有这种行为。
假设您想表达:
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
$
Is it possible to write a one-line
if then else
statement in a language that supports short-circuiting? It doesn't have to be language specific, just pseudocode.
如果你不知道,短路意味着语言将通过首先 执行计算 exp1 || exp2 || exp3 || exp4...
(||
是 or
运算符) exp 1
,那么如果returns为真,执行exp 2
,依此类推……然而,exp n
returns false,它不会继续评估 exp n+1
以及之后的任何内容。
在C、C++、C#和Java中,你可以这样做(所有4个都支持短路):
a = a>b ? a : b;
这将分配 a
两者中较大的一个,a
或 b
。
这叫做ternary operator
。首先是要测试的条件 a>b
,然后是问号,然后是 true
值(例如 a
),然后是冒号,然后是 false
值(例如 b
).
你不能简单地短路。这意味着通过跳过第一个条件之后的所有条件来缩短正在评估的条件的数量,这将使整个条件 true
或 false
(基于运算符)。
例如:
boolean x = true || 1 == 2;
||
计算不会检查 1 == 2
的值,因为 true
已经将 ||
变为真,无论后面是什么。
以类似的方式 &&
:
boolean y = 2 < 3 && 5 > 6;
为了进一步扩展,我可以这样写:
boolean y = 2 < 3 && 5 > func();
在任何一种情况下,都不会检查条件的后半部分(并且不会调用 func()),因为前半部分给出 false
.
没有办法做某事 else
,只有这种行为。
假设您想表达:
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
$