gpt4 book ai didi

c - 函数不以 return 语句结束

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:38 26 4
gpt4 key购买 nike

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

function ".." does not end in a return statement !

这是我的代码:

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

}

最佳答案

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

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

  • 禁用编译器警告。 (对于 Clang,命令行选项 -Wno-return-type 可以做到这一点。)(在 C 中,允许非空函数从函数末尾流出而不返回值,前提是调用者不尝试使用返回值。)
  • 让编译器明白函数返回。

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

首先,考虑:

if (string_length(s) <= 1)

else if (string_length(s) > 1)

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

有些编译器有一个特性,允许你声明一个函数为,这会告诉编译器它在给定相同输入的情况下返回相同的值,并且不会改变程序的状态其他方法。如果您使用了该功能,或者编译器可以看到 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 语句。

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

关于c - 函数不以 return 语句结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com