【问题标题】:function does not end in a return statement函数不以 return 语句结束
【发布时间】:2019-06-19 11:19:11
【问题描述】:

我是 C 新手,但我了解编码的基础知识。但是,我看不出为什么编译器会返回错误:

函数“..”不以返回语句结束!

这是我的代码:

string same_start_end(string s)

{
  char first_letter = string_charat(s, 0);
  string empty = "";
  if( string_length(s) <= 1)
  {
      return s;
  }
  else if (string_length(s) > 1)
  {
      for (int  i = 0; i < string_length(s); i++)
      {
          if( (string_charat(s, i) == first_letter) && (i != 0))
          {
              return string_sub(s, 0,i);
          }
      }
  }

}

【问题讨论】:

  • 我不明白为什么编译器会返回此错误”,因为编译器只是一个编译器。
  • 因为它没有以return语句结束?理解你的 if-else if 可能不够聪明。写 if-else。
  • @Lundin: "if-else":我怀疑这是否有帮助,因为它可能无法预先确定 string_charat() 会做什么。不过好吧,又是一场猜谜比赛。
  • 如果您拥有的两个return 语句都不会发生,会发生什么情况?如果循环刚刚结束会发生什么?
  • @Lundin:并非详尽无遗。当外部else被执行时,它里面的循环并不总是执行return

标签: c string return


【解决方案1】:

使用 C 和 C++ 时,定义函数时必须小心。通过写string,你告诉编译器这个函数必须返回一个字符串。如果您不想这样做,请尝试切换到void,因为 void 不会返回值。如果你想使用 void,但仍然让外部函数知道变量,你应该使用指针。在您的情况下,有时不会执行退货

【讨论】:

    【解决方案2】:

    编译器警告说,控制可能会到达非 void 函数的末尾,因为控制可能会到达非 void 函数的末尾。

    为防止这种情况,您必须执行以下操作之一:

    • 禁用编译器警告。 (对于 Clang,命令行选项 -Wno-return-type 执行此操作。)(在 C 中,如果调用者不尝试使用返回值。)
    • 让编译器清楚该函数返回。

    编译器不清楚函数返回的路径有两种。

    首先,考虑:

    if (string_length(s) <= 1)
       …
    else if (string_length(s) > 1)
    

    在数学上,我们知道 x ≤ 1 或 x > 1,因此“x ≤ 1 或 x em> > 1” 是真的。但是,编译器不知道对string_length(s) 的第一次调用返回与第二次调用相同的值。所以它不能知道这些条件中的至少一个是真的。它必须假设它们都可能是假的,然后控制将在没有return 语句的情况下流向函数的末尾。

    一些编译器有一个特性,允许你将一个函数声明为 pure,这会告诉编译器它在给定相同输入的情况下返回相同的值,并且不会改变程序在其他方法。如果您使用了该功能,或者编译器可以看到string_length 的定义,它可能能够检测到这两个条件之一为真。但是,更简单的解决方法是将else if (string_length(s) &gt; 1) 更改为else。那么编译器知道如果if子句没有被执行,那么else子句一定是。

    其次,考虑:

    for (int  i=0; i<string_length(s);i++)
        {
          if( (string_charat(s,i)==first_letter) && (i!=0))
            {
              return string_sub(s, 0,i);
            }
        }
    

    此循环可以在不触发if 的情况下结束。 s 中可能没有字符等于第一个字符,因此永远不会执行 return。然后循环完成,控制流到函数的末尾,没有return 语句。

    为防止这种情况,您可以在for 循环之后插入return 语句。当找不到匹配项时,它将返回您想要返回的任何值。

    【讨论】:

      【解决方案3】:

      您只需要在您的ifelse if声明回报。如果这两个失败,你有没有return语句。考虑做和else而不是做的else if或具有毕竟那些return语句。 P>

      编辑:

      您的循环没有,如果你迭代通过它,它永远不会触发if语句 P>返回任何东西

      【讨论】:

      • 仅使用else无助既是当前return语句是有条件的。如果没有条件为真,则循环将结束,该函数将刚用完而没有任何无条件退货。 SPAN>
      • 即使我一直是作为的if-else,我得到了同样的信息! SPAN>
      • @ Someprogrammerdude你是对的。还有的是,有没有结果,如果循环完成并且如果从来没有触发的路径。需要有一个return语句从单独是否。如果一切都失败了,你觉得你覆盖所有的基地,把return 0你的函数结束 SPAN>
      • 返回零是完全错误的功能承诺返回一个字符串:),我明白你的意思,但是编译器如何看这些可能性,我的意思是有没有语法错误 SPAN>
      • @ Mer_如果存在未解析编译器将捕获它的可能的代码路径。您需要动辄返回的东西,因为函数需要返回的东西 SPAN>
      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2019-05-28
      • 2020-06-16
      • 2018-03-03
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多