在所有的例子中我都看到了它是如何工作的
condition?value = true:value = false
我还没有找到它实际上是如何工作的。采用这种操作模式,几乎可以清楚地解释。
Short-circuit evaluation
As logical expressions are evaluated left to right, they are tested
for possible "short-circuit" evaluation using the following rules:
false && anything is short-circuit evaluated to false.
true || anything is short-circuit evaluated to true.
短路一词的实际含义是什么?
?: 的左侧是否得出相同的结论?就像 && 和 || 一样难道这样右边的?短路(失败),所以它转到 : 的右侧,然后它不会失败。相反,它完成了一个动作。
短路这个词让我很困惑,因为我没有清楚地理解它。
我所知道的就是这个。
这适用于返回值为零或 true 或 yes
if true && then do this
如果左侧的返回值非零则失败
if false || then do this
如果左侧的返回值为零则失败
在这种理解下,我再次提出这个问题。
条件(三元)运算符是否以相同的方式进行评估并以相同的方式进行操作?
我必须把它拆开来证明这个问题。
false ? anything is short-circuit evaluated to false.
true : anything is short-circuit evaluated to true.
看起来它被解释为
!true ? then fail
true : then fail
或者
true ? then no failure
false : then no failure
它在 ? 的最左边得出结论:
hypothesis ? conclusion true : conclusion false
对于逻辑运算符以同样的方式
hypothesis && conclusion true operation preformed
hypothesis || conclusion false operation preformed
它们都采用相同的方法吗?
两个逻辑运算符被视为一个,条件(三元)运算符
三个都是逻辑运算符吗?
我用我知道它们都可以使用的所有编程语言来标记它们,这样我就可以得到这个问题的全部真相。
我祈祷我没有在这件事上让任何人感到困惑。是的,那么这可能是由于我对此感到困惑。
答案1
“短路”意味着如果你有这样的表达式:
( something evaluating to false) && (something else)
它永远不会执行任何内容(something else)
- 它会立即终止,因为false && anything
永远是假的。
相似地:
(something evaluating to true ) || (something else)
评估 没有意义,(something else)
因为条件已经为真。
至于三元运算符A ? b : c
仅A
是一个布尔表达式。根据其值b
或c
将被评估(b
如果A
为真,否则c
)。因此,这里不会像&&
and运算符那样发生“短路” ||
。从来不存在同时b
和都被执行的情况c
,它总是其中之一。
将三元视为 if-else 语句可能会有所帮助。在上面的示例中,A
is 条件表达式、b
isthen
子句和c
iselse
子句。唯一的区别是整个三元表达式将产生b
or的值c
,具体取决于A
true 或 false。
这是 C 语言的一个例子。假设我想要一个字符串来说明一个数字N
是偶数还是奇数:
char *result = ((N % 2) == 0) ? "even" : "odd";
这是一种通过“短路”来实现的方法(不是很好的风格,但它演示了这个概念):
char *result = "even";
((N % 2) == 0) || (result = "odd");
在最后一个例子中,如果N
是偶数,它会将赋值短路为“奇数” - 赋值永远不会发生,因为表达式不会被求值,因为结果在到达 时就已经知道为真,||
所以结果将保持“均匀”。
答案2
“短路”的意思是(按照评估顺序)结果一明确,所有进一步的评估就会被跳过。
For||
和&&
这意味着在x = (true || send_mail())
调用中send_mail()
被跳过,因为操作数是从左到右计算的,并且 true 或 d 任何结果都为 true。
对于三元运算符,术语“短路”可以在更广泛的意义上使用,因为对于逻辑运算符来说,没有从左到右的求值顺序。这里的概念更准确地称为“惰性求值”。这仅仅意味着,在评估条件之后,仅有的评估匹配的“结论”部分。
所以x = (ask_user() ? try_send_mail() : try_send_letter())
只执行try_send_mail()
或者 try_send_letter()
但绝不会同时两者兼而有之。