如果任何条件为false,如何从for循环返回false

时间:2017-03-03 14:43:31

标签: c++ if-statement for-loop return boolean

我正在研究一个函数,如果任何一个点位置在定义的矩形边界之外,它应该返回false。

我目前的c ++代码如下:

bool trackingPointsVisible(){
        //I've got 4 points here
        if(!points.empty()){
              // loop through each of the points
            for(int i=0; i<points.size(); i++){
                   //check if points' x and y positions are out of the boundaries
                if(points[i].x < -60 || points[i].x > 300 ||
                points[i].y < -60 || points[i].y > 300){
                   // if any of them are out return false 
                    return false;
                }else{
                   //if they're within the boundaries, return true
                    return true;
                }

            }
        }
  }

由于某种原因,即使其中一个点超出指定的边界,它也会返回true。我不认为应该是这种情况。我应该重写这个功能并单独检查每个点还是有另一种方法?

有人可以指出我在这里做错了什么吗?感谢。

3 个答案:

答案 0 :(得分:5)

您根据第一点的检查返回,而不继续检查任何其他点。如果在区域外找到一个点,则应返回false,否则继续检查剩余的点,仅在循环外返回true。

无论它值多少,你都可以简化代码:

bool trackingPointsVisible()
{
    for (const auto& point : points)
        //check if points' x and y positions are out of the boundaries
        if (point.x < -60 || point.x > 300 ||
            point.y < -60 || point.y > 300)
            return false;
    return true;
}

...或者,更具声明性......

bool trackingPointsVisible()
{
    // check none of the points are out of bounds...
    return std::none_of(std::begin(points), std::end(points),
                        [](const Point& point) {
                           return point.x < -60 || point.x > 300 ||
                                  point.y < -60 || point.y > 300;
                        });
}

答案 1 :(得分:1)

首先,该函数具有未定义的行为,因为在容器points为空时它不返回任何内容。

其次,只有在检查了所有点时才必须返回true。那就是true的return语句必须在循环之外。

可以通过以下方式定义该功能。

bool trackingPointsVisible()
{
        //I've got 4 points here
        size_t i = 0;

        while ( i < points.size() and not
                ( points[i].x < -60 || points[i].x > 300 ||
                  points[i].y < -60 || points[i].y > 300 ) ) i++;

        return i == points.size();
}

声明

size_t i = 0;

可以替代

decltype( points )::size_type i = 0;

例如

bool trackingPointsVisible()
{
        //I've got 4 points here
        decltype( points )::size_type i = 0;

        while ( i < points.size() and not
                ( points[i].x < -60 || points[i].x > 300 ||
                  points[i].y < -60 || points[i].y > 300 ) ) i++;

        return i == points.size();
}

答案 2 :(得分:1)

只能在函数末尾返回true:

bool trackingPointsVisible(){
    //I've got 4 points here
    if(!points.empty()){
        // loop through each of the points
        for(int i=0; i<points.size(); i++) {
            //check if points' x and y positions are out of the boundaries
            if(points[i].x < -60 || points[i].x > 300 ||
            points[i].y < -60 || points[i].y > 300) {
               // if any of them are out return false 
                return false;
            }
        }
    }

    return true;
}