2011-09-16 2 views
1
#include<stdio.h> 

int i; 
int increment(int i) 
{ 
    return ++i; 
} 

int main() 
{ 
    for(i=0;i<10;increment(i)) 
    { 
     printf("%d",i); 
    } 
    return 0; 
} 

여기서 출력은 000000입니다. 즉, 무한 루프가 발생합니다.은이 no-op 또는 다른 것입니까?

++ i (증분 함수로 반환 됨) 값을 저장하는 변수가 없거나 다른 이유로 인해 연산이 필요하지 않음을 알고 싶습니다. .설명 해주십시오.

+0

'for (i = 0; i <10; i = 증분 (i))'과 비교하고 [Call by Value] (http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value) 함수 또는 프로 시저가 해당 매개 변수에 값을 할당 할 수 있으면 해당 로컬 복사본 만 할당됩니다. 즉, 함수 호출로 전달 된 모든 내용은 함수가 반환 될 때 호출자의 범위에서 변경되지 않습니다. " (음영 처리 기능도 있습니다. increment의 매개 변수가'x' 인 경우 동일합니다.) –

답변

12

예, 작동하지 않습니다. 값이 값으로 전달 되었기 때문에 increment에 대한 호출은 아무 것도 변경하지 않습니다.

i의 로컬 정의는 전역 정의를 어둡게합니다. 따라서 i의 로컬 정의 만 사용되며 i의 전역 정의는 변수의 로컬 복사본에서 수행되는 증가분의 영향을받지 않습니다.

+0

@Mystical : 값으로 전달하고 있기 때문에 아무 작업도하지 않는다고 말하고 있습니다. 그런 다음 우리가 쓰는 이유는 무엇입니까? (i = 0; i <10; i = increment (i))이면, 0에서 10까지의 값을 출력하는 이유는 무엇입니까? –

+3

'increment' 함수는 shadowing과 pass로 인해'i'의 값을 변경하지 않습니다. 가치에 의해. 그러나 새로운 값을 반환합니다. 그래서 'i'에 다시 할당하면 증가합니다. 할당하지 않으면 아무 일도 일어나지 않고 '나는'같은 상태로 유지됩니다. – Mysticial

2

증가되는 변수는 increment에 전달 된 인수의 로컬 복사본입니다. 당신은 i이라는 이름을지었습니다. 그래서 명확하지 않을 수도 있지만, 요점은 increment 내의 i이 전 세계적으로 정의 된 것과 같지 않다는 것입니다.

관련 문제