2010-12-01 4 views
5

간단한 질문. 이것을 ANSI-C로 상상해보십시오 :For-Loop 카운터는 유지됩니까?

int i; 

for(i=0 ; i<5 ; i++){ 
    //Something... 
} 

printf("i is %d\n", i); 

출력이 "i is 5"입니까?

i이 보존 되었습니까? 아니면 루프 이후에 i의 값이 정의되지 않았습니까?

답변

14

예. for 루프 외부에서 선언 된 경우 루프가 종료 된 후에도 범위에 남아 있습니다. 루프가 종료 한 시점의 값은 그대로 유지됩니다.

당신은 루프에서 I를 declatred 경우 : 다음 루프 종료 후 정의되지

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

} 

합니다.

1

변수 i는 루프 범위 밖에서 정의됩니다 (이 경우 큰 값이거나이 경우 인쇄 할 수 없습니다).

그리고 그것은 루프의 매 턴마다 끝내기 조건이 "5보다 크거나 같을 때 멈추다"라고 post -icnremented됩니다.

그래서 나는이 시점에서 내가 5와 동등하다는 것을 완벽하게 이해합니다.

블록 범위는 C의 함수 범위와 완전히 동일하지 않습니다. 변수 i는 루프 범위에서 벗어날 때 마술처럼 이전 값으로 "돌아 오지 않습니다".

1

i의 값은 루프 이후 5입니다. 당신이 뭔가를하지 않는 한

i = 50000; 

내부에 그런 짓을하지 않으면.

0

내가 읽은 대부분의 코딩 표준에서 루프를 종료 한 후에도 "i"를 사용하지 않는 것이 좋습니다. 특히 다음을 수행하지 마십시오.

이것은 제대로 작동하지 않지만 코딩은 좋지 않습니다. 대안보다 읽기 쉽고 유지 보수가 쉽지 않습니다. 예 :

succeeded = false; 

for(i = 0; i < num_elements; i++) 
{ 
    if(element[i].id == id) 
    { 
     /* Do something to element here. */ 
     succeeded = true; 
     break; 
    } 
} 

if(false == succeeded) 
{ 
    fprintf(stderr, "Failed to find element %d.", id); 
} 
0

예, 변수는 선언 된 블록 내에서만 유효합니다.

gcc ex.c 
ex.c: In function ‘main’: 
ex.c:10: error: ‘x’ undeclared (first use in this function) 
ex.c:10: error: (Each undeclared identifier is reported only once 
ex.c:10: error: for each function it appears in.) 
+0

ERR, 무엇 : 컴파일러의

#include <stdio.h> void main(int argc, char *argv[]) { if(argc == 2) { int x; x = 7; } x = 1; } 

: 다음은 예입니다? 그는 "A 사건인가, B인가?"라고 물었다. 그러한 질문은 만족스럽게 "예"또는 "아니오"로 대답 할 수 없습니다. 또한 그는 블록 밖에서 변수를 선언했다. 이 답변이 관련성이 있거나 필요한 답변을 찾지 못했습니다 (이전 답변에 아직 포함되지 않은 새로운 정보를 추가하지 않기 때문에). – AlastairG

+0

네 말이 맞아. 나는 누군가가 이미 내가 왜 보존되어 있는지 (Visage의 대답이 가장 좋았음) 설명했기 때문에 간단히 'yes'라고 대답한다. 이 예제를 추가하는 것이 다른 답변을 완성하는 데 유용 할 수 있다고 생각했습니다. =) – BlackBear

관련 문제