错误:控制可能会在C中达到非空函数的结束

csp*_*all 10 c controls

我无法弄清楚为什么会发生这种错误: error: control may reach end of non-void function

这是代码:

bool search(int value, int values[], int n) {

    if (n < 1) {
        return false;
    }   

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

我理解错误意味着函数可能在没有返回任何内容的情况下到达终点,但我无法弄清楚这可能会发生什么.

Gri*_*han 9

你得到这个错误,因为如果你的for循环由于破坏条件而中断,i < n;那么它returnfor循环之后就找不到任何语句(参见下面的代码中我提到的注释).

for (int i = 0; i < n; i++){
    if (values[i] == value){
        return true;
        break;
    }
    else{ 
        return false;
    }
}
  // here you should add either return true or false     
}
Run Code Online (Sandbox Code Playgroud)

如果for由于i >= n当时控制导致的循环中断到达我评论的位置并且没有return声明存在.因此,您将收到一个错误"在C中达到非空函数的结尾".

此外,删除breakreturn声明.如果return执行则break永远不会有机会执行并打破循环.

   return true;  -- it returns from here. 
    break;  -- " remove it it can't executes after return "
Run Code Online (Sandbox Code Playgroud)

检查你的编译器应该给你一个警告 - "无法访问的代码".


Hol*_*Cat 5

该编译器警告不正确。无论如何,您的代码存在更大的问题:

bool search(int value, int values[], int n) {

    if (n < 1) {
        return false;
    }   

    for (int i = 0; i < n; i++) {
        if (values[i] == value) {
            return true;
            break;
        }
        else {            // !
            return false; // ! <-- Here is the mistake.
        }                 // !
    }    
}
Run Code Online (Sandbox Code Playgroud)

此代码仅检查values[0] == value然后始终返回。正因为如此else {return false;}

你应该这样写:

bool search(int value, int values[], int n) {

    if (n < 1) {
        return false;
    }   

    for (int i = 0; i < n; i++) {
        if (values[i] == value) {
            return true;
            // break;  <- BTW, it's redundant.
        }
    }    
    return false;
}
Run Code Online (Sandbox Code Playgroud)

现在,函数检查整个values数组,false如果没有匹配项,则返回。但是如果找到匹配项,它会立即返回true而不检查其他元素。

此外,编译器不会为此代码发出警告。