要修复警告,请在check 末尾添加return:
bool
check(string word)
{
for (int i = 0; i >= 9; i++) {
if (strcmp(name, word) == 0) {
return true;
}
else {
return false;
}
}
// NOTE/FIX: fixes the warning
return false;
}
但是,check 函数中的 for 循环什么都不做(它在每次迭代中做同样的事情),所以你不需要循环。
另外,请注意您从不将name 初始化为任何内容,因此它会出现段错误,因为string 实际上是char *。您需要将其设置为有效的指针值。
这是一个带有诊断测试的重构版本:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
string name = "hello";
bool
check(string word)
{
bool match;
match = (strcmp(name,word) == 0) ? true : false;
return match;
}
string testlist[] = {
"hello", "world", NULL
};
int
main(void)
{
for (string *cur = testlist; *cur != NULL; ++cur) {
bool ok = check(*cur);
printf("%s: %s\n",*cur,ok ? "match" : "fail");
}
return 0;
}
这是程序输出:
hello: match
world: fail
你能帮我处理第一段中的代码吗?看起来它最后只会返回 false 吗?
当然。你是对的。它只是在末尾添加了一个return 语句[with一个值]。
哎呀。我刚刚注意到您的for 循环将永远执行,甚至一次。那是因为 i 被初始化为 0。但是,循环条件是 i >= 9,在第一次迭代时将是 false。
事实上,编译器的优化器会检测到这一点并完全省略循环。
如果您想循环 [出于某种原因] 10 次,正确的 for 循环应该是:
for (int i = 0; i <= 9; i++)
使用这个更正的循环,添加的return 将永远实际执行。这是因为循环现在保证执行至少一次。
它将尝试循环 10 次。但是,if 要么是真要么是假,在 either 的情况下,它会从 within 循环中执行 return,所以事情会立即停止。
执行最终/添加的return 永远不会“退出”循环。
但是,编译器无法“知道”这一点。
或者,更重要的是,它仍然应该在底部标记缺少return,即使它确实意识到它不会在实践中执行。
看到的是for循环执行后,到了函数的底部,对于一个返回一个值的函数,没有 em> return 语句 [with value] 用于该代码路径。