C++返回语句奇怪的行为?

Cha*_*Dev 0 c++

我发现了一些关于return陈述的新事物(对我自己而言).与强制调试器结合forif强制调试器不从函数返回控制并继续执行下一个语句,而是堆叠在函数内部并重复for直到条件不为真.例如:

struct Position
{
    int position;
    int value;
};

vector<Position> find_all(vector<Position>& v, int value)
{
    vector<Position> res;
    for (auto p = v.begin(); p != v.end(); ++p)
        if (p->value == value)
            res.push_back(*p);

    return res;
}

int main()
{
    vector<Position> v { { 0, 0 }, { 1, 1 }, { 2, 0 }, { 3, 3 },
                         { 4, 4 }, { 5, 6 }, { 6, 0 }, { 7, 2 } };
    find_all(v, 0); 
    cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你设置调试器return res;并开始调试代码,当你进入这个方法时,函数将继续在函数内执行,直到for循环结束,而不是返回.如果在if语句中设置花括号,则返回将正常工作.

我不明白请有人解释我发生了什么,为什么?我正在使用VisualC++return在Stroustrup书中找到了这种用法.

cdm*_*dmh 5

这是源级调试器试图跟踪机器代码执行回源代码的症状.该for环具有一个条件p != v.end(),其实际上是一种while条件,在每次迭代进行评价.该条件评估通常在循环结束时(至少在MSVC中).在您的示例中,循环结束时没有代码,因此调试器将"当前行"显示为循环后的语句,即return res;行.

如果你在for循环体上放置花括号,并在新行上结束卷曲,那么调试器将有一行代码与条件相关联,你将看到预期的行为.

vector<Position> find_all(vector<Position>& v, int value)
{
    vector<Position> res;
    for (auto p = v.begin(); p != v.end(); ++p)
    {
        if (p->value == value)
            res.push_back(*p);
    }

    return res;
}
Run Code Online (Sandbox Code Playgroud)

请记住,调试器显示当前行的近似值.在调试模式下,这通常非常准确,但有些情况下,它"看起来很奇怪".如果您尝试单步执行Release版本,并进行优化,您会注意到"当前行"似乎在全部跳转.