我发现了一些新的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
语句中设置大括号,则return将正常工作。
我不明白,请有人向我解释会发生什么,为什么?我正在使用,VisualC++
但return
在Stroustrup书中发现了这种用法。
这是源代码级调试器的症状,该调试器试图将机器代码的执行跟踪回源代码。该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;
}
请记住,调试器显示的是当前行的近似值。在调试模式下,这通常非常准确,但是在某些情况下,它看起来“很奇怪”。如果您尝试逐步进行带有优化的Release版本,您会发现“当前行”似乎四处跳动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句