이 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
해야하는 경우 자체 기능 이 있어야합니다.