【问题标题】:An or operator in a return?返回中的 or 运算符?
【发布时间】:2019-02-09 22:33:34
【问题描述】:

我刚刚看到了类似的东西:

return (m(s1 + 1, s2) || m(s1 + 1, s2 + 1));

||return 语句中的含义是什么? 这里,m 是一个函数; s1s2 是字符串。

【问题讨论】:

  • 那里的意思和其他地方的意思一样。它是逻辑或运算符。
  • 与其说是“返回”,不如说是评估该表达式然后返回它的结果。
  • 这意味着return语句返回01。如果对m 的左侧调用返回1(或任何其他非零值),则不会进行右侧调用(结果将为1);如果左侧调用返回0,则进行右侧调用,如果RH调用返回0,则返回值为0,否则返回1。这是|| 运算符的正常短路行为。
  • @JonathanLeffler 你不能指望 1,它可能是其他一些非零值。
  • @nicomp:什么不能算1?该问题被标记为“递归”,并且“m”被指定为函数,因此m 很可能是一个递归函数,而这个return 语句在m 中。函数中可能还有其他return 语句;不能保证这些返回 01 因为我们还没有看到它们。但是,这个return 语句只会返回01,因为|| 运算符仅计算为01

标签: c recursion return


【解决方案1】:

return 语句中使用|| 运算符并没有什么特别之处。像这样的声明:

return <expression>;

相当于:

temp = <expression>;
return temp;

(其中temp 的类型与函数的返回类型相同)。

所以你的陈述相当于:

int temp = (m(s1 + 1, s2) || m(s1 + 1, s2 + 1));
return temp;

【讨论】:

    【解决方案2】:

    return (m(s1 + 1, s2) || m(s1 + 1, s2 + 1)); 行可以改写成这种形式:

    if ( m(s1 + 1, s2) )
    { 
        /* if left part not null, return 1, without 
           evaluationg the right part */
        return 1;
    }
    else if ( m(s1 + 1, s2 + 1) )
    {  
        /* if left was 0, test right part */
        return 1;
    }
    else
    { 
        /* if both are null, return 0*/
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      || 是短路或,意味着表达式将在第一个真值作为结果时停止执行。 它与此代码具有相同的效果,但如果您知道 || 的含义,它会更短且更易于阅读:

      if (m(s1 + 1, s2)) {
        return 1;
      }
      if(m(s1 + 1, s2 + 1)) {
        return 1;
      }
      return 0;
      

      如果m 在屏幕上打印了一些内容,那么它只会在第一次调用返回真值时打印一次。您还有&amp;&amp;,它执行类似的操作,但在第一个错误值处停止。 return (m(s1 + 1, s2) &amp;&amp; m(s1 + 1, s2 + 1)); 等同于:

      if (!m(s1 + 1, s2)) {
        return 0;
      }
      if (!m(s1 + 1, s2 + 1)) {
        return 0;
      }
      return 1;
      

      使用运算符的明显原因是您需要更少的样板。

      【讨论】:

      • 在 C 中,auto value = m(s1 + 1, s2); 中所示的“隐式int”走上了 C99 中的渡渡鸟之路(尽管肯定有 C 编译器仍会接受它)。在 C 语言中,您不使用 auto — 没有理由这样做,并且编写 auto 实际上是错误的(非常不习惯)。在 C++ 中,规则大不相同——但 C++ 是一种与 C 非常不同的语言。
      • 此答案中的代码与原始代码不等价,因为原始代码必然返回0或1,而此代码返回m返回的值,可能会有所不同。
      • @EricPostpischil 这是一厢情愿的想法。当然 C 会实现 ||&amp;&amp; 错误:-(。无论如何修复了代码。
      • @JonathanLeffler 我的编辑不再需要绑定,但感谢您的评论。我的 C 经验早于 C99,所以我可能有点生疏:-p
      猜你喜欢
      • 2023-01-10
      • 2015-07-08
      • 2020-01-20
      • 2014-12-18
      • 1970-01-01
      • 2010-10-23
      • 2016-07-08
      • 2018-04-17
      • 1970-01-01
      相关资源
      最近更新 更多