if-else 块引发"control reaches end of non-void function"警告

if-else Block Raises a "control reaches end of non-void function" Warning

本文关键字:of non-void function 警告 end control if-else reaches      更新时间:2023-10-16

我正在创建一个基于三种几何形状的碰撞检查函数:直线,矩形和圆形。我写了一个Line-Line检查函数,看起来像这样:

bool check_collision(jLine L1, jLine L2, double singular_threshold=1e-6){
    /*Variable definitions omitted for brevity*/
    if (parallel){
        return false;
    }
    else if (infinite){
        return true;
    }
    else{
        jVector t;
        t = M.inverse()*(s2 - s1);
        double t1 = t.get_x(), t2 = t.get_y();
        on1 = (0. <= t1) and (t1 <= 1.);
        on2 = (0. <= t2) and (t2 <= 1.);
        if (seg1){
            if (not on1){
                return false;
            }
            else if (seg2){
                if (not on2){
                    return false;
                }
                else{
                    return true;
                }
            }
        }
        else{
            if (on2){
                return true;
            }
            else{
                return false;
            }
        }
    }
}

所有变量和类型都被正确定义,不会引起任何问题。然而,当我编译这段代码时,警告给出了"控制到达非空函数的结束"。这个警告似乎表明我的if-else树包含一个没有return语句的分支。然而,据我所知,每个分支都以返回bool类型对象结束。我错过什么了吗?

当我在函数的最后添加return true;时,警告被删除了,但我觉得这应该是不必要的。我还假设,只要使用if-else链,就会发出此警告。我用另一个完全由if-elif-else链组成的函数反驳了这一点:

bool check_collision(jRect R1, jRect R2){
    if (R2.left() > R1.right()){
        return false;
    }
    else if (R2.right() < R1.left()){
        return false;
    }
    else if (R2.top() > R1.bottom()){
        return false;
    }
    else if (R2.bottom() < R1.top()){
        return false;
    }
    else{
        return true;
    }
}

编译此函数时不会引发警告。有人能告诉我我漏掉了什么吗?

据我所知,每个分支都以返回bool类型对象结束。我错过什么了吗?

嗯,是的。

        if (not on1){
            return false;
        }
        else if (seg2){
            if (not on2){
                return false;
            }
            else{
                return true;
            }
        }

在这段代码中,您的ifelse if,但没有else。如果else被"触发",则该函数在遇到return语句之前将运行完代码。

编译器警告你,你没有写任何代码来处理on1 && !seg2。如果这个条件不可能,我们不能说,因为我们看不到seg2;但是,更重要的是,编译器不能说两者。

相关文章: