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

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

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

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

【问题讨论】:

    标签: if-statement operators lazy-evaluation short-circuiting


    【解决方案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 都会被评估(听起来很愚蠢和危险,但显然就是这样它有效)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-02
      • 2014-01-13
      • 2015-10-25
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多