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 ).
답변
할 수 있습니다. 그러나 i
s 의 범위를 알고 있어야합니다 . 외부 i
with i_1
및 내부 i
with를 호출하면 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++){
}
}
