C - 使用某些if/else语法时,'控件可能会达到非空函数的结束'

off*_*066 7 c if-statement function

在C中定义函数时,在以某种方式编写if/else逻辑时,我会在编译器中收到"控件可能达到非空函数结束"错误(下面的场景1),但是在编写时我没有收到错误逻辑另一种方式(下面的场景2).对我来说,编写这个函数的两种方式看起来都很相似,所以我不知道为什么版本1不能编译.

场景1

bool search(int value, int values[], int n)
{
    int i;
    if (n<1)
        {
            return false;
        }
    for(i=0;i<n;i++)
    {
        if (value==values[i])
        {
            return true;
        }
        else
        {
           return false; 
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

情景2

bool search(int value, int values[], int n)
{
    int i;
    if (n<1)
        {
            return false;
        }
    for(i=0;i<n;i++)
    {
        if (value==values[i])
        {
            return true;
        }
    }
    return false; 
}
Run Code Online (Sandbox Code Playgroud)

在for循环之后,场景2是否总是返回false?或者在第一次返回值后,函数本质上是"停止",因此一旦值与值[i]匹配,则返回"true"?

das*_*ght 6

问题是C编译器不够智能,无法确定第一个函数在没有返回值的情况下到达末尾的情况:

  • 当循环执行至少一次时,if语句的两个分支都有一个条件返回,和
  • 当循环从不执行时,将从函数顶部的条件语句返回.

C标准不需要这样的检查,因此编译器会发出警告.

  • *这也是编译器错过了第二个代码的最后一个返回语句永远不会到达的事实的原因.* - 这不是真的 - 考虑值何时不在数组中. (2认同)