programing

'while' 및 'for' 루프의 범위는 무엇입니까?

powerit 2023. 7. 7. 21:12
반응형

'while' 및 'for' 루프의 범위는 무엇입니까?

의 범위는 무엇입니까?while그리고.for루프?

예를 들어 루프 내에서 개체를 선언한 경우 해당 동작은 무엇이며 그 이유는 무엇입니까?

다음 예제에서는 루프의 각 반복에 대해 모든 변수가 파괴되고 재생성됩니다.i루프 반복 사이에 지속되며 for 루프의 조건식과 최종식에 사용할 수 있습니다.루프 외부에서 사용할 수 있는 변수는 없습니다.for 루프 본체 내부의 변수 파괴는 다음 이전에 발생합니다.i증가합니다.

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.
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그리고.bfor 루프의 범위에서만 볼 수 있습니다.범위에는 루프에 있는 내용이 포함됩니다.()그리고.{}

언급할 가치가 있다고 생각했습니다.

일부 컴파일러에는 for 루프 이니셜라이저 내에 생성된 변수의 범위에 영향을 주는 옵션이 있을 수 있습니다.예를 들어 Microsoft Visual Studio에는 /Zc: for Scope(루프 스코프의 경우 Force Compliance in) 옵션이 있습니다.기본값은 표준 c++ 동작입니다.그러나 for 루프 변수가 for 루프 범위 밖에서 활성 상태로 유지되도록 변경할 수 있습니다.VS를 사용하는 경우 이 옵션이 존재하므로 원하는 동작으로 설정할 수 있습니다.이 옵션이 있는 다른 컴파일러가 있는지 확실하지 않습니다.

일부 컴파일러는 최적화 설정 및 "데드 스토어" 제거로 인해 불필요하다고 생각하는 코드를 제거할 수 있습니다.예를 들어 루프 내부에서 변경 중인 변수가 루프 외부에서 읽히지 않으면 루프 자체가 컴파일러에 의해 삭제될 수 있습니다.

예를 들어, 다음 루프를 생각해 보십시오.

int cnt = 0;
int trys = MAX_INT;
while (trys-- > 0)
{
  cnt += trys;
}

Cnt 변수가 루프 뒤에 사용되지 않기 때문에 일부 컴파일러는 루프 내용을 폐기할 수 있습니다.

for 또는 while 루프에서 선언된 변수도 루프 내에서 범위가 지정된다는 것을 추가하려고 합니다.예:

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

// index is out of scope here.
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;
    }
}

그 목적은 명확하게 정의된 시퀀스 점에서 변수가 범위를 벗어나는 것입니다.

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

샘플 에서 둘 다 " 샘플코서둘다에드위의▁both"입니다.i그리고.f는 범내포니다됩함에의위 내에 .{그리고}닫는 중괄호가 실행되면 두 변수가 모두 범위를 벗어납니다.

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

동기 부여와 관련하여, 이것이 여러분의 이익에 사용될 수 있다는 것을 고려하십시오.

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

위의 코드에서 우리는 RAII 스마트 포인터를 사용하여 루프 내에서 만든 값비싼 객체를 "소유"하고 있습니다.의범지의론의 지정 forloop은 루프가 실행될 때마다 해당 반복 중에 생성된 개체가 삭제됨을 나타냅니다.

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

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

이 코드를 확인하십시오.

#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

루프가 실행되는 동안 - 내부에 정의된 변수 i는 로컬 범위를 가지고 있는 반면 (i > 3) 아래의 변수는 글로벌 변수를 따르며 로컬 범위를 참조하지 않습니다.

디판.

변수가 루프 범위 내에 있습니다.즉, 루프 내에 있어야 액세스할 수 있습니다.이는 함수 내에서 변수를 선언한 경우와 마찬가지로 함수 내의 항목만 변수에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7880658/what-is-the-scope-of-a-while-and-for-loop

반응형