이 함수 정의가
void fact(a,b) {
if(b == 1) {
return;
} else {
a = a * b;
b = b - 1;
fact(a, b);
}
}
실제로 보이는 (컴파일러가 그것을 받아들이는 제공) 다음과 같은 방법으로
,396,442,
함수 정의에서 변수 a
및 b
즉,이 호출 따라서, 함수 호출
fact(a, b);
하여 함수에 제공된 인수 사본이 함수의 로컬 변수는이 글로벌 사용 변수 a
및 b
이지만 함수 자체 내에는 전역 변수의 복사본 인 로컬 변수 a
및 b
이 사용됩니다. 이러한 지역 변수의 변경 사항은 전역 변수에 영향을 미치지 않습니다.
문제를 해결하는 방법?
첫 번째 방법은 함수 매개 변수를 제거하는 것입니다. 함수 정의 내이 경우 a
및 b
에서 전역 변수
void fact(void)
{
if(b == 1) {
return;
} else {
a = a * b;
b = b - 1;
fact(a, b);
}
}
을 표시하고 당신은 예상 된 결과를 얻을 것이다.
두 번째 방법은 매개 변수를 사용하는 것뿐 아니라 결과를 반환하는 것입니다. 예 :
int 사실 (a, b) int a, b; { if (b == 1) { return a; } 다른 {
a = a * b;
b = b - 1;
return fact(a, b);
}
}
및 기능을 다음과 같은 방법
a = fact(a, b);
그러나 이러한 함수 정의가되지 않습니다를 호출합니다.
int fact(int a, int b)
{
if(b == 1) {
return a;
} else {
a = a * b;
b = b - 1;
return fact(a, b);
}
}
그리고 세 번째 방법처럼 쓸 더 좋을 거라 참조로 함수에 인수를 전달하는 것입니다. 예를 들어
void fact(int *pa, int *pb)
{
if(*pb == 1) {
return;
} else {
*pa = *pa * b;
*pb = *pb - 1;
fact(pa, pb);
}
}
및 통화는 다음과 같은 방법을 기능을
int fact(int n)
{
return n < 1 ? 1 : n * fact(n - 1);
}
를 작성하고
a = fact(b);
과 같이 호출하는 것이 더 간단 할 것이다 그러나
같은 기능 함수는'a'와'b'의 * copies *를 전달받습니다. d는 아무것도 돌려주지 않습니다. 함수의'a'와'b'는 같은 이름의 글로벌 변수와 다른 변수이며 지역 범위 (및 수명) 만 있습니다. –
함수 안에있는 매개 변수 변수'a'와'b'는 같은 이름을 갖는 전역 변수를 가리 킵니다. – Barmar
이 코드가 컴파일됩니까? – Jay