在forandwhile循环的条件下,还可以声明一个对象。在循环结束之前,该对象将一直处于作用域内,并将在循环的每次迭代中保持不变:
for (int i = 0; i < 5; ++i) { do_something(i); } // 我不再是范围。 for (auto& a : some_container) { a.do_something(); } // a不再是范围。 while(std::shared_ptr<Object> p = get_object()) { p->do_something(); } // p不再是范围。
但是,不允许do...while循环执行相同的操作。相反,请在循环之前声明变量,并(可选)将变量和循环都包含在本地作用域中,如果您希望变量在循环结束后超出作用域:
//这不编译 do { s = do_something(); } while (short s > 0); // 好 short s; do { s = do_something(); } while (s > 0);
这是因为循环的语句部分do...while(循环的主体)是在到达表达式部分(即while)之前求值的,因此,在循环的第一次迭代过程中,表达式中的任何声明都是不可见的。