函数不会以return语句结尾

时间:2019-01-25 15:34:21

标签: c string 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);
          }
      }
  }

}

3 个答案:

答案 0 :(得分:2)

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

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

  • 禁用编译器警告。 (对于Clang,命令行选项-Wno-return-type做到了这一点。)(在C语言中,如果调用者未尝试执行此操作,则允许非void函数从该函数的末尾流出而不返回值)使用返回值。)
  • 对于函数返回的编译器来说很明显。

有两条路径使编译器不清楚函数是否返回。

首先,请考虑:

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

从数学上讲,我们知道 x ≤1或 x > 1,因此“ 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语句。如果找不到匹配项,它将返回您想要返回的任何值。

答案 1 :(得分:1)

您的ifelse if语句中只有收益。如果两者均失败,则没有return语句。考虑做and else而不是做else if或在所有这些之后都使用return语句。

编辑:

如果循环访问,则for循环不会返回任何内容,并且永远不会触发if语句

答案 2 :(得分:0)

使用C和C ++时,定义函数时必须小心。通过编写string,您告诉编译器此函数必须返回字符串。如果您不想这样做,请尝试切换到void,因为void不会返回值。如果要使用void,但仍让外部函数知道变量,则应使用指针。就您而言,退货有时无法执行