C++ 对于带括号的循环中的return语句,将显示错误可能到达非void函数的末尾,但对于不带括号的循环,则不显示错误

C++ 对于带括号的循环中的return语句,将显示错误可能到达非void函数的末尾,但对于不带括号的循环,则不显示错误,c++,C++,在第一种情况下,它显示错误:控制到达非void函数的末尾。 但在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误。有人能告诉我编译器在这两种情况下到底发生了什么吗? 还有,为什么案例1中的return语句不被确认 //case 1 int checkA(const vector<int>& a, int n, int k) { for(int i=0; i<n; i++) { if(k%a[i])

在第一种情况下,它显示错误:控制到达非void函数的末尾。 但在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误。有人能告诉我编译器在这两种情况下到底发生了什么吗? 还有,为什么案例1中的return语句不被确认

//case 1
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
        { if(k%a[i])
                return 0;
            return 1;
        }
    }
//case 2
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
         if(k%a[i])
                return 0;
            return 1;
    }
//案例1
整数校验a(常数向量&a,整数n,整数k)
{

对于(int i=0;i在第一种情况下,您在循环中无条件地返回1;
。但是如果循环没有运行(当
n
在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误

这是不正确的。在第二种情况下,代码执行不同的操作

有人能告诉我编译器在这两种情况下到底发生了什么吗

假设您调用
checkA({2,5},2,2)

在案例1中,您的函数执行以下操作:

  • i=0;

  • 检查
    i它不会做同样的事情。如果您发布的代码片段格式更好,您将看到以下内容:

    //case 1
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
        {
            if(k%a[i])
                return 0;
            return 1;
        }
    }
    
    //案例1
    整数校验a(常数向量&a,整数n,整数k)
    {
    
    对于(int i=0;i我坚决支持在
    for
    while
    、和
    if
    语句下使用
    {}
    块,即使只有一行代码。这使代码更容易理解。使用这种方法

    案例1相当于:
    int checkA(常量向量&a,int n,int k)
    {
    
    对于(int i=0;i“…代码做同样的事情…”不,不是。是什么让你想到这个主意的?第二个代码段中的
    return
    语句在
    for
    循环之外,在第一个代码段内部。因此,如果
    n
    0
    或更小,第一个代码段将永远不会返回任何内容,因为循环体没有执行。它不会执行相同的操作。在第一种情况下,
    return 1
    在循环内。如果代码没有进入循环(
    n
    小于或等于0),函数将不返回任何内容。第二种情况下,
    return 1
    在循环外,它完全正常(总是返回)。好的。我理解了。谢谢
    //case 2
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
            if(k%a[i])
                return 0;
        return 1;
    }
    
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
        {
           if(k%a[i])
           {
              return 0;
           }
           // return statement in the loop outside the if statement.
           return 1;
        }
    
        // No return statement after the loop.
    }
    
    int checkA(const vector<int>& a, int n, int k)
    {
        for(int i=0; i<n; i++)
        {
           if(k%a[i])
           {
               return 0;
           }
           // no return statement in the loop outside the if statement.
        }
    
        // return statement after the loop.
        return 1;
    }