[c] ‘for’루프 내부의 ‘for’루프가 동일한 카운터 변수 이름을 사용할 수 있습니까?

for루프 내부의 루프에 동일한 카운터 변수를 사용할 수 있습니까 for?

아니면 변수가 서로 영향을 미칠까요? 다음 코드는, 제 2 루프에 다른 변수를 사용한다 j이거나, 또는 i미세?

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



답변

동일한 이름 (식별자)을 사용할 수 있습니다. 다른 개체가됩니다. 서로 영향을주지 않습니다. 내부 루프 내부에는 외부 루프에 사용 된 객체를 참조 할 수있는 방법이 없습니다 (포인터를 제공하는 것과 같이 특별히 준비하지 않는 한).

이것은 일반적으로 나쁜 스타일이며 혼동을 일으키기 쉬우므로 피해야합니다.

개체는 int i표시된 것처럼 내부 개체가 별도로 정의 된 경우에만 다릅니다 . 새 객체를 정의하지 않고 동일한 이름을 사용하면 루프가 동일한 객체를 사용하고 서로 간섭합니다.


답변

첫째, 이것은 절대적으로 합법적입니다. 코드가 컴파일되고 실행되어 중첩 된 루프의 본문을 10×10 = 100 번 반복합니다. i중첩 루프 내부의 루프 카운터 는 외부 루프의 카운터를 숨기 므로 두 카운터가 서로 독립적으로 증가합니다.

외부 i가 숨겨져 있기 때문에 중첩 된 루프 본문 내부의 코드 는 외부 루프가 i아닌 중첩 된 루프 의 값에만 액세스 할 수 있습니다 i. 중첩 루프가 외부에 액세스 할 필요가없는 상황에서 i이러한 코드는 완벽하게 정당화 될 수 있습니다. 그러나 이는 독자들에게 더 많은 혼란을 야기 할 수 있으므로 “유지 관리 책임”을 피하기 위해 그러한 코드를 작성하지 않는 것이 좋습니다.

참고 : 두 루프의 카운터 변수가 동일한 식별자를 가지더라도 i두 개의 독립 변수로 남아 있습니다. 즉, 두 루프에서 동일한 변수를 사용 하지 않습니다 . 두 루프에서 동일한 변수를 사용하는 것도 가능하지만 코드를 읽기가 어렵습니다. 다음은 예입니다.

for (int i = 1 ; i < 100 ; i++) {
    for ( ; i % 10 != 0 ; i++) {
        printf("%02d ", i);
    }
    printf("%d\n", i);
}

이제 두 루프 모두 동일한 변수를 사용합니다. 그러나 컴파일하지 않고이 코드가 수행하는 작업을 파악하려면 시간이 걸립니다 ( demo ).


답변

할 수 있습니다. 그러나 is 의 범위를 알고 있어야합니다 . 외부 iwith i_1및 내부 iwith를 호출하면 s i_2의 범위는 i다음과 같습니다.

for(int i = 0; i < 10; i++)
{
     // i means i_1
     for(int i = 0; i < 10; i++)
     {
        // i means i_2
     }
     // i means i_1
}

서로 영향을주지 않으며 정의 범위 만 다릅니다.


답변

그것은 완전히 가능하지만 첫 번째 선언 된 i 를 해결할 수 없다는 것을 명심하십시오.

for(int i = 0; i < 10; i++)//I MEAN THE ONE HERE
{

  for(int i = 0; i < 10; i++)
    {

    }
}

두 번째 자식 루프 내의 두 번째 루프

for(int i = 0; i < 10; i++)
{

  for(int i = 0; i < 10; i++)//the new i
    {
        // i cant see the i thats before this new i here
    }
}

첫 번째 i의 값을 조정하거나 얻으려면 두 번째 루프에서 j를 사용하십시오.

for(int i = 0; i < 10; i++)
{

  for(int j = 0; j < 10; j++)
    {

    }
}

창의력이 충분하다면 한 번의 루프에서 두 가지를 모두 수행 할 수 있습니다.

for(int i ,j= 0; i < 10; (j>9) ? (i++,j=0) : 0 ,j++)
{
    printf("%d %d\n",i,j);
}


답변

예, 내부 for루프에 외부 for루프 와 동일한 카운터 변수 이름을 사용할 수 있습니다 .

에서 루프 :

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
로 사용되는 표현 문 loop_statement는 자신의 설정 범위는 별개 블록 범위init_clause을 .

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}  

의 범위 loop_statement가 되는 중첩 의 범위 init_clause .

C Standards # 6.8.5p5 반복문에서 [강조]

반복 문은 범위가 둘러싸는 블록 범위의 엄격한 하위 집합 인 블록입니다. 루프 본문은 범위가 반복 문의 범위의 엄격한 하위 집합 인 블록이기도합니다 .

C Standards # 6.2.1p4 식별자 범위 [강조]

…. 내부 범위 내에서 식별자는 내부 범위에 선언 된 엔티티를 지정합니다. 외 범위에서 선언 엔티티 숨겨진 내부 범위 (및 보이지 않음).


답변

코드 / 컴파일러 관점에서 이것은 완벽하게 타당하고 합법적 인 일입니다. int i내에서 선언 된 for(int i = 0; i < 10; i++)루프, 새롭고 더 작은 범위에 있다고 선언 그래서 그림자 의 선언 int i다른 단어와 외부 루프에서 (또는, 상기 변수의 상기 내부 영역 내의 모든 액세스 i받는 이동 int i내측 범위에서 선언 int i외부 범위에 그대로 둡니다 ).

즉, 코드 품질 관점에서 이것은 완전히 끔찍합니다. 읽기 어렵고 이해하기 어렵고 오해하기 쉽습니다. 하지마.


답변

예, 사용할 수는 있지만 꽤 혼란 스럽습니다. 가장 중요한 것은 루프 내부의 지역 변수 범위입니다. 변수가 함수 내에서 선언 된 경우 해당 변수의 범위는 해당 함수입니다.

int a = 5;
// scope of a that has value 5
int func(){
    int a = 10;
   // scope of a that has value 10
}
// scope of a that has value 5

마찬가지로 루프가있는 경우 내부 루프 내부에서 선언 된 변수는 다른 범위를 가지며 변수로 선언 된 외부 루프는 다른 범위를 갖습니다.

for(int i = 0; i < 10; i++){
    // In first iteration, value of i is 0

    for(int i = 1; i < 10; i++){
        // In first iteration, value of i is 1
    }
    // In first iteration, value of i is 0
}

더 나은 방법은 내부 및 외부 루프에 서로 다른 변수를 사용하는 것입니다.

for(int i = 0; i < 10; i++){

    for(int j = 1; j < 10; j++){

    }

}