if-then-else 运算符的短路评估(例如 ?: 在 C 中)

Posted

技术标签:

【中文标题】if-then-else 运算符的短路评估(例如 ?: 在 C 中)【英文标题】:Short Circuit evaluation of an if-then-else operator (e.g. ?: in C) 【发布时间】:2017-06-04 17:13:10 【问题描述】:

我需要用任何语言编写一个程序,如果该语言在 if-then-else 运算符中使用短路评估,则打印 1,如果语言不使用,则打印 0。

我的问题是,if-then-else 运算符中的短路评估是什么意思?

仅仅是在 && 和 || 中发生的惰性求值吗?运营商?

【问题讨论】:

【参考方案1】:

如果我没看错这个问题,那么是的。在实现这一点的语言中,如果你有这样的声明

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) ...

例如,如果Afalse,为什么还要检查其余的表达式?

在赋值方面,我给你一个提示:如果你在其中一个表达式中有副作用会发生什么?

【讨论】:

感谢您的解释,只是为了确保我没问题,下面的代码可以解决问题吗?诠释a = 0; ( 1 || (a=1) )? printf("%d",1-a ) : printf("1");在 C 编译器上运行时,它会打印 1,因为 C 使用了短路,但如果 C 没有在 if 运算符上使用短路,则输出将为 0,对吧? @SirajOtman 我的 C 有点生锈,我没有坐在 IDE 前,但如果我没记错的话,“1”将评估为“真”(如果我错了,请纠正我)所以它应该只评估整个事情。 1 确实转换为 true,但由于 C 使用短路,它不应该(而且它没有,我试过)评估整个字符串。我的问题是,如果语言确实评估了整个 if-statement ,输出会是 0 吗?【参考方案2】:

如果有人面临类似的分配/想了解更多关于 C 中 if 运算符短路的信息: 首先,让我们将 if 运算符的每个部分标记如下:

如果(表达式)?区块A : 区块B;

现在,在 PL C 中,在 if-then-else 运算符短路之后,如果 Expression 被评估为 true,则 only BlockA 被评估,否则 only BlockB 被评估

现在让我们假设 C 不遵循短路,发生的情况是无论表达式的评估结果如何, BlockA 和 BlockB 都会被评估(听起来很愚蠢和危险,但显然就是这样它有效)

【讨论】:

以上是关于if-then-else 运算符的短路评估(例如 ?: 在 C 中)的主要内容,如果未能解决你的问题,请参考以下文章

短路逻辑评估运算符

短路评估顺序和前缀增量运算符

Twig 三元运算符,简写 if-then-else

当运算符优先级说不应该时,为啥短路评估会起作用?

布尔逻辑运算符

我将如何修改运算符“&&”和“||”的定义让他们不使用短路评估?