태그 보관물: scope

scope

자체 중괄호 안의 For 루프

이 for 루프 레이아웃을 보았습니다.

#include <iostream>
int main()
{
    {
        for (int i = 0; i != 10; ++i)
        {
            std::cout << "delete i->second;" << std::endl;
        }
    }

    {
        for (size_t i = 0; i < 20; ++i)
        {
            std::cout << "delete m_indices[i];" << std::endl;
        }
    }
    return 0;
}

이 여분의 교정기 층이 무엇인지 궁금합니다. 이것은 우리 코드베이스에 몇 번 나타납니다.



답변

옛날 옛적에, 여러 달 전에 VS6가 존재했고 인기가있었습니다. 그러나 여러 C ++ 표준을 따르지 못했습니다. 표준이 공식적으로 발표되기 직전 (같은 해에) 발표 되었기 때문에 당시에는 합리적이었습니다. 그러나 내가 아는 한 표준 초안을 고수했습니다.

초안과 공식 표준 사이에 변경된 표준 중 하나는 첫 번째 섹션에서 만든 for 루프 변수의 수명입니다. 컴파일에 실패하는 다음 코드로 이어지는

{
    for (int i=0; i<1; ++i){}
    for (int i=0; i<2; ++i){}
}

i두 번째 for 루프에 의해 재정의 되었기 때문 입니다.

다른 컴파일러들도이 버그를 겪었습니다. VS6 버전은 표준이 출시 된 후 몇 년 동안 Visual Studio의 유일한 버전 이었지만이 특정 문제에 대한 업데이트를 출시하지 않았기 때문에 강조합니다. 더 큰 영향을 미쳤음을 의미합니다.

이에 대한 해결책은 전체 for 루프를 사용자가 보여준대로 자체 범위로 강제하는 것입니다.


답변

{}범위를 작성하고 당신이 범위에 일부 변수를 정의하는 경우는 외부에서 액세스 할 수 없습니다. 그러나 for이미 그 범위를 만듭니다. 그래서

{for(int i = 0; i < count; ++i){}} 

와 같다

for(int i = 0; i < count; ++i){}

하지만 그들 사이에 무언가를 정의하면 차이가 있습니다

{int a = 0; for(int i = 0; i < count; ++i){}}

이 예에서는 a외부 범위에서 액세스 할 수 없습니다.


답변

귀하의 특정 예에는 이유가 없습니다.

때로는 변수에 대한 범위를 만들고 싶을 수 있습니다.

float average;
// ...

{
int sum = 0;
for (int i = 0; i < count; ++i)
{
   sum += v[i];
}
average = (float)sum / count;
}

// use average
// sum not in scope here

그러나 나는 이것이 반 패턴이라고 본다. 일반적으로이 작업을 수행 for해야하는 경우 자체 기능 이 있어야합니다.


답변

그것은 A의 블록 범위 로 표시 {}중괄호. 일반적 으로 자동 저장 영역을 표시하는 데 사용됩니다 . 귀하의 경우에는 for 루프 가 표준 C ++에서 자체 범위 를 갖기 때문에 아무것도하지 않는 것 같습니다 .


답변