首页 > 解决方案 > 函数不以 return 语句结束

问题描述

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

函数“..”没有以 return 语句结束!

这是我的代码:

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);
          }
      }
  }

}

标签: cstringreturn

解决方案


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

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

  • 禁用编译器警告。(对于 Clang,命令行选项-Wno-return-type会执行此操作。)(在 C 中,允许非 void 函数从函数末尾流出而不返回值,前提是调用者不尝试使用返回值。 )
  • 让编译器清楚该函数返回。

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

首先,考虑:

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

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

一些编译器具有允许您将函数声明为pure的功能,这将告诉编译器它在给定相同输入的情况下返回相同的值,并且不会以其他方式更改程序的状态。如果您使用了该功能,或者编译器可以看到 的定义string_length,它可能能够检测到两个条件之一为真。但是,解决此问题的更简单方法是更改else if (string_length(s) > 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声明。

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


推荐阅读