0

我发现了一些关于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;
}

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

我不明白,请有人解释一下会发生什么以及为什么?我正在使用,但在 Stroustrup 书中VisualC++发现了这种用法。return

4

1 回答 1

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;
}

请记住,调试器显示当前行的近似值。在调试模式下,这通常非常准确,但在某些情况下,它“看起来很奇怪”。如果您尝试通过优化逐步执行发布版本,您会注意到“当前行”似乎到处跳来跳去。

于 2013-07-27T13:07:45.373 回答