【问题标题】:Is it necessary to include a return statement after my while loop in this function?是否有必要在此函数中的 while 循环之后包含 return 语句?
【发布时间】:2016-10-07 17:21:07
【问题描述】:

我有一个类似的功能

int myfun(int *a, int *b)
{
    while(some condition)
    {
        if(condition) return *a + *b;
        else
        {
            some manipulation;
        }
    }
    return -1;
}

当while->if部分遇到第一个return语句时,控制是否转到调用myfun的函数或while循环仍然继续?为什么需要return -1语句?

【问题讨论】:

  • 放实际代码,这个问题不清楚...
  • 一旦循环中的return语句被命中,函数myfun将立即结束。最后一个 return 是为了防止 if 语句永远不会到达,在这种情况下,*a+*b 永远不会返回,而是必须返回其他东西。
  • -1 当“某些条件”变为假时返回。也许数据已经用完了。 -1 通常用于指示错误。然而,它实际上是 C 中指针的非法值。如果 null 是非错误的,该函数应该设置一个标志,而不是尝试构造一个替代的无效指针。
  • 为什么int* 会返回int 值?这没有意义。
  • 这是 IMO 的一种不好的做法。我建议始终在函数顶部声明您的返回变量。您可以使用默认值设置它(或者不必,但我大部分时间都这样做),然后在满足条件时更改它。顶部的声明将清楚地显示要在代码中跟踪的变量名称(以及这是函数而不是过程)

标签: c function return


【解决方案1】:

return *a+*b 之后,函数返回并结束。您需要return -1,因为如果该条件从未满足,它将返回什么?这是一个int 函数,所以它必须返回一些东西。

【讨论】:

  • 嗯...从技术上讲,它是一个 int * 函数,因此它的返回 -1 是可怕的,但很明显它只是一个普通的 int 函数。
  • 假设我注意了,如果在 while 循环中至少满足一次条件,编译器仍然会检查 return -1 语句吗?
  • 是的,因为编译器不知道它总是正确的。
  • @AnshikaJain 编译器接受从int到int*的隐式转换,但不是没有显式返回的函数?有意思,我很想知道这是哪个编译器。
  • 我不确定标准,但 GCC 会很高兴地编译一个缺少返回的函数,同时发出警告。它只会返回堆垃圾。不过可能是未定义的行为。
【解决方案2】:

如果不满足some condition,控制将永远不会进入循环并继续执行函数结束的下一行。

在这种情况下,函数应该返回一些值,因为它没有void 返回类型。因此,return -1

【讨论】:

    【解决方案3】:

    是的,亲爱的,如果“if”语句的条件为真,那么在这种情况下,函数将在该点返回。 return -1 语句很有帮助,而且确实是必要的,因为它注意即使“if”语句从未执行过也会返回某些内容。如果该函数被声明为 void myfunc 那么它肯定会导致错误。

    【讨论】:

      【解决方案4】:

      return -1语句是必须的,因为some_condition可能第一次没有被填满,所以不会进入while循环。

      因此必须提供一些返回值(在这种情况下为-1)。

      【讨论】:

        【解决方案5】:

        第一个 return 语句仅在满足它的条件时应用。如果条件满足,return 语句立即将控制权交还给调用函数,但是,如果由于某种原因 if 不满足,则 while 循环的所有迭代都满足,最后它必须返回一个整数值由于返回类型是整数,控制再次流回调用函数。

        【讨论】:

          【解决方案6】:

          函数的每个端点(退出)都必须有返回语句(如果函数的声明当然是这样的话)。您编写的代码将由编译器处理,因此它应该准确地知道您的所有可能的退出点功能取决于满足您功能中分支的标准。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-24
            • 1970-01-01
            • 2010-12-31
            • 2021-09-28
            • 1970-01-01
            • 1970-01-01
            • 2020-12-01
            相关资源
            最近更新 更多