を は、以下のコードを修正します次のようにします。
関数定義の変数
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);
}
}
を意味し、あなたが期待される結果を取得します。
第2のアプローチは、パラメータを使用するだけでなく、結果を返すことです。例えば、
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