如何评估条件(三元)运算符?

如何评估条件(三元)运算符?

在所有的例子中我都看到了它是如何工作的

 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 : cA是一个布尔表达式。根据其值bc将被评估(b如果A为真,否则c)。因此,这里不会像&&and运算符那样发生“短路” ||。从来不存在同时b和都被执行的情况c,它总是其中之一。

将三元视为 if-else 语句可能会有所帮助。在上面的示例中,Ais 条件表达式、bisthen子句和ciselse子句。唯一的区别是整个三元表达式将产生bor的值c,具体取决于Atrue 或 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()但绝不会同时两者兼而有之。

相关内容