我发现了一些关于return
语句的新内容(对我自己而言)。与for
和if
结合使用时,强制调试器不从函数返回控制并继续执行下一个语句,而是堆叠在函数内部并重复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
语句中设置大括号,则返回将正常工作。
我不明白请有人解释我发生了什么,为什么?我正在使用VisualC++
,但在Stroustrup书中找到了这种return
用法。
答案 0 :(得分:5)
这是源级调试器试图跟踪机器代码执行回源代码的症状。 for
循环的条件p != v.end()
实际上是while
条件,并在每次迭代时进行评估。该条件评估通常在循环结束时(至少在MSVC中)。在您的示例中,循环结束时没有代码,因此调试器将“当前行”显示为循环后的语句,即return res;
行。
如果在for
循环体周围放置花括号,并且在新行上结束,则调试器将有一行代码与条件相关联,您将看到预期的行为。 / p>
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;
}
请记住,调试器显示当前行的近似值。在调试模式下,这通常非常准确,但有些情况下,它“看起来很奇怪”。如果您尝试单步执行发布版本,并进行优化,您会注意到“当前行”似乎在全部跳转。