c++ - 여러개 - 'while'및 'for'루프의 범위는 무엇입니까?



for문 설명 (7)

whilefor 루프의 범위는 무엇입니까?

예를 들어, 루프 내에서 객체를 선언했다면 그 동작은 무엇입니까? 그 이유는 무엇입니까?

https://ffff65535.com


C / C ++에서 for 또는 while 루프 (또는 다른 모든 괄호로 묶인 블록)에서 선언 된 변수의 범위는 열린 대괄호에서 닫는 대괄호까지입니다.

while (some_condition == true)
{
   int myVar = 3;
}
cout << myVar << endl; // This will cause a compilation error

for 또는 while 루프에서 선언 된 변수도 루프 내에서 범위가 지정되도록 추가하고 싶었습니다. 예 :

for (int index = 0; index < SOME_MAX; ++index)
{
    ...
}

// index is out of scope here.

다음 예에서 루프를 반복 할 때마다 모든 변수가 삭제되고 다시 작성됩니다. i 는 루프 반복간에 지속되며 for 루프의 조건부 및 최종 표현식에서 사용할 수 있습니다. 루프 밖에서 사용할 수있는 변수는 없습니다. 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;
}

이유에 관해서는; 루프는 실제로 자신의 본문에 대해 단일 문을 사용합니다. 중괄호로 작성된 복합 문이라고하는 명령문이 있습니다. 복합 명령문에서 작성된 변수의 범위는 복합 명령문 자체로 제한됩니다. 그래서 이것은 정말로 루프를위한 특별한 규칙은 아닙니다.

루프 및 선택 문에는 루프 또는 선택 문 자체의 일부로 생성 된 변수에 대한 자체 규칙이 있습니다. 이들은 디자이너가 가장 유용하다고 느끼는 것에 따라 설계되었습니다.


루프에서 선언 된 것은 그 루프에 범위가 지정되며 중괄호 밖에서는 액세스 할 수 없습니다. 사실 새 스코프를 만들 때 루프가 필요하지 않습니다. 다음과 같이 할 수 있습니다.

{
   int x = 1;
}

//x cannot be accessed here.

이 코드를 확인하십시오.

#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> 3) 는 전역 변수를 따르고 로컬 범위를 참조하지 않습니다.

Dipan.


for( int i = 0; i < 10; ++i )
{
  string f = "foo";
  cout << f << "\n";
}
// i and f are both "gone" now

위의 예제 코드에서 if 는 모두 { {and } } 범위에 있습니다. 닫는 중괄호를 실행하면 두 변수가 모두 범위를 벗어납니다.

그 이유는 단순히 표준이 그렇게 말하고 있기 때문입니다. 그것이 C ++ 언어가 작동하는 방식입니다.

동기 부여에 관해서는, 이것이 당신의 이점에 사용될 수 있다고 생각하십시오 :

for( ...)
{ 
  std::auto_ptr<SomeExpensiveObject> obj(new SomeExpensiveObject);
}

위의 코드에서 우리는 루프 내에서 만든 비싼 객체를 "소유"하기 위해 RAII 스마트 포인터를 사용하고 있습니다. for 루프의 범위 지정 의미에 따라 루프를 실행할 때마다 해당 반복 중에 만들어진 개체가 삭제됩니다.


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

ab 는 for 루프의 범위에서만 볼 수 있습니다. 범위에는 루프의 (){}





c