【发布时间】:2017-06-04 17:13:10
【问题描述】:
我需要用任何语言编写一个程序,如果该语言在 if-then-else 运算符中使用短路评估,则打印 1,如果语言不使用,则打印 0。
我的问题是,if-then-else 运算符中的短路评估是什么意思?
仅仅是在 && 和 || 中发生的惰性求值吗?运营商?
【问题讨论】:
标签: if-statement operators lazy-evaluation short-circuiting
我需要用任何语言编写一个程序,如果该语言在 if-then-else 运算符中使用短路评估,则打印 1,如果语言不使用,则打印 0。
我的问题是,if-then-else 运算符中的短路评估是什么意思?
仅仅是在 && 和 || 中发生的惰性求值吗?运营商?
【问题讨论】:
标签: if-statement operators lazy-evaluation short-circuiting
如果我没看错这个问题,那么是的。在实现这一点的语言中,如果你有这样的声明
if (A || B || C || D)
一旦发现一个正确的陈述,运行时就会停止评估。例如,如果 A 和 B 为假,但 C 为真,它会评估 A、B 和 C,但不会评估 D。如果您执行以下操作,这一点很重要:
if (a != null && a.ToString() == "abc")
短路行为意味着如果a 实际上是null,则不会执行该 if 语句的后半部分,这很关键,因为如果不是这种情况,那么该语句可以抛出空引用异常。如果不是这样,您将不得不做类似的事情
if (a != null) {
if (a.ToString() == "abc") {
// ...
这显然不那么简洁了。
&& 的行为方式类似:
if (A && B && C && D) ...
例如,如果A 是false,为什么还要检查其余的表达式?
在赋值方面,我给你一个提示:如果你在其中一个表达式中有副作用会发生什么?
【讨论】:
如果有人面临类似的分配/想了解更多关于 C 中 if 运算符短路的信息: 首先,让我们将 if 运算符的每个部分标记如下:
如果(表达式)?区块A : 区块B;
现在,在 PL C 中,在 if-then-else 运算符短路之后,如果 Expression 被评估为 true,则 only BlockA 被评估,否则 only BlockB 被评估
现在让我们假设 C 不遵循短路,发生的情况是无论表达式的评估结果如何, BlockA 和 BlockB 都会被评估(听起来很愚蠢和危险,但显然就是这样它有效)
【讨论】: