IT story

자체 중괄호 내부의 루프

hot-time 2020. 7. 18. 10:03
반응형

자체 중괄호 내부의 루프


이 for-loop 레이아웃을 보았습니다.

#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 버전으로 유지되었지만이 특정 문제에 대한 업데이트를 발표하지 않았기 때문에 VS6 버전을 강조합니다. 더 큰 영향을 미쳤다는 의미입니다.

이에 대한 해결책은 표시된대로 전체 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

However I see this an anti-pattern. Usually if you find yourself in need of doing this then most likely the for should be its own function.


It's a block scope marked by {} braces. It is usually used to mark the area of automatic storage. In your case it doesn't seem to do anything as the for loop has its own scope in standard C++.

참고URL : https://stackoverflow.com/questions/49447957/for-loop-inside-its-own-curly-braces

반응형