while
和for
循环的范围是什么?
例如,如果我在循环中声明了一个对象,它的行为是什么?为什么?
答案 0 :(得分:37)
在以下示例中,除了i
之外,所有变量都被销毁并重新创建,除了i
之外,它在循环迭代之间持续存在,并且可用于for循环中的条件和最终表达式。循环外没有变量可用。在while(int a = foo()) {
int b = a+1;
}
for(int i=0;
i<10; // conditional expression has access to i
++i) // final expression has access to i
{
int j = 2*i;
}
递增之前,for循环体内的变量被破坏。
{{1}}
至于为什么;循环实际上为它们的主体采用单个语句,只是发生了一个名为由大括号创建的复合语句的语句。在任何复合语句中创建的变量范围仅限于复合语句本身。所以这对循环来说并不是一个特殊的规则。
循环和选择语句对于作为循环或选择语句本身的一部分创建的变量有自己的规则。这些只是根据设计师认为最有用的设计而设计的。
答案 1 :(得分:33)
循环中声明的任何内容都限定在该循环中,并且不能在花括号外部访问。实际上,您甚至不需要循环来创建新范围。你可以这样做:
{
int x = 1;
}
//x cannot be accessed here.
答案 2 :(得分:15)
int d;
// can use d before the loop
for(int a = 0; a < 5; ++a) // can use a or d in the ()
{
int b;
// can use d, a, b in the {}
}
int c;
// can use d, c after the loop
a
和b
仅在for循环的范围内可见。范围包括循环的()
和{}
答案 3 :(得分:8)
我认为值得一提:
某些编译器可能有一个选项,它会影响在for循环初始化程序中创建的变量的范围。例如,Microsoft Visual Studio有一个选项/Zc:forScope(for Loop Scope中的强制一致性)。它默认为标准c ++行为。但是,这可以更改,以便for循环变量在for循环范围之外保持活动状态。如果您使用VS,请注意此选项存在可能很有用,这样您可以确保将其设置为所需的行为。不确定是否有其他编译器有此选项。
由于优化设置和“Dead Store”消除,一些编译器可能会删除它认为不必要的代码。例如,如果循环内部更改的变量未在循环外的任何位置读取,则编译器可能会丢弃循环本身。
例如,请考虑以下循环:
int cnt = 0;
int trys = MAX_INT;
while (trys-- > 0)
{
cnt += trys;
}
有些编译器可能会丢弃循环的[内容],因为循环后没有使用变量Cnt。
答案 4 :(得分:5)
只是想添加在for或while循环中声明的变量也在循环中作用域。例如:
for (int index = 0; index < SOME_MAX; ++index)
{
...
}
// index is out of scope here.
答案 5 :(得分:5)
int a;
for(int b=0; b<10; ++b) {
int c;
}
范围就像是:
int a;
{
int b=0;
begin:
if (b<= 10)
{
{
int c;
}
++b;
goto begin;
}
}
目的是使变量在明确定义的序列点超出范围。
答案 6 :(得分:4)
for( int i = 0; i < 10; ++i )
{
string f = "foo";
cout << f << "\n";
}
// i and f are both "gone" now
在上面的示例代码中,i
和f
都限定在{
{和}
}范围内。执行右括号时,两个变量都不属于范围。
原因很简单就是标准所说的;这就是C ++语言的工作原理。
至于动机,请考虑这可以对您有利:
for( ...)
{
std::auto_ptr<SomeExpensiveObject> obj(new SomeExpensiveObject);
}
在上面的代码中,我们使用RAII智能指针“拥有”我们在循环中创建的昂贵对象。 for
循环的作用域语义规定,在每次循环执行后,在该迭代期间创建的对象将被销毁。
答案 7 :(得分:3)
查看此代码
#include < stdio.h >
int i = 10;
int main() {
for(int i=0; i<3; i++) {
fprintf(stdout," for i = %d & upper i = %d\n",i,::i);
}
while (i>3) {
int i = 30;
fprintf(stdout," while i = %d & upper i = %d\n",i,::i);
i++;
fprintf(stdout," while i = %d & upper i = %d\n",i,::i);
}
fprintf(stdout,"i = %d \n",i);
}
在上面的代码中,全局变量 i 与控制for循环的变量不同。
会打印
for i = 0 & upper i = 10
for i = 1 & upper i = 10
for i = 2 & upper i = 10
执行while循环时 - 内部定义的变量 i 具有局部范围,其中(i&gt; 3)下的变量跟随全局变量,而不引用局部范围。
DIPAN。
答案 8 :(得分:2)
在C / C ++中,在for或while循环(或任何其他括号内的块)中声明的变量的范围是从开括号到近括号。
while (some_condition == true)
{
int myVar = 3;
}
cout << myVar << endl; // This will cause a compilation error
答案 9 :(得分:2)
变量在循环范围内。即你需要在循环内访问它。它与在函数中声明变量的情况相同,只有函数中的内容才能访问它。