電子書籍の厳選無料作品が豊富!

フィボナッチ数列と関数を呼び出した回数を求めるプログラムを書いたのですが、下記のプログラムでは関数を呼び出した回数がカウントされず次の部分
scanf("%d",&num);
printf("%d %d\n",fib(num),count);
これをint型の変数Fを用いて、
scanf("%d",&num);
F=fib(num);
printf("%d %d\n",F,count);
このようにしたら正確に実行することができました。これってなぜですかね?

#include <stdio.h>

int count;

int fib(int n)
{
count++;

if(n==1 || n==2)
return 1;
return fib(n-1)+fib(n-2);
}

int main()
{
int num;
count=0;

scanf("%d",&num);
printf("%d %d\n",fib(num),count);

return 0;

}

また、カウントをポインタを使って行おうとして、次のようにプログラムを少し改良したのですが
Segmentation fault (コアダンプ)
と出ました。解決法を教えてください。

#include <stdio.h>

int *count;

int fib(int n)
{
*++count;

if(n==1 || n==2)
return 1;
return fib(n-1)+fib(n-2);
}

int main()
{
int num,F;
*count=0;

scanf("%d",&num);
F=fib(num);
printf("%d %d\n",F,*count);

return 0;

}

A 回答 (4件)

>printf("%d %d\n",F,count);


>このようにしたら正確に実行することができました。これってなぜですかね?

>printf("%d %d\n",fib(num),count);
では、printfが呼ばれた時の、fib(num)とcountが使われます。
従って、コンパイラが、
 countの値、fib(num)の値の順番に、printfに値を渡す場合

 fib(num)の値、countの値の順番に、printfに値を渡す場合
とでは、表示が変わってきます。
質問者さんのコンパイラは前者のタイプだったわけですね。

>printf("%d %d\n",F,count);
では、printfが呼ばれた時、すなわち、fib(num)を実行した後の count の値が使われる
からでしょう。

教訓:実行順序に依存するようなパラメタは使わない
おまけ:
変数Fが増えるのが嫌ならば、Fを局所変数として定義して
{
int F; F=fib(num);
printf("%d %d\n",F,*count);
}
のようにコーディングすれば、printfを実行した直後に、局所変数Fは消滅して、他のプログラム部分に影響を及ぼす心配はなくなります
    • good
    • 0

グローバルなポインタで初期値を与えなかった場合「0 で初期化」するので「ナルポインタ」になるんだけど, それが「全ビット0」という

保証はないです>#2. あと, *++count; と *count++; は意味が違いますよね>#1. どっちにしても本来想定した動作にはならないのですが.
    • good
    • 0

>また、カウントをポインタを使って行おうとして、次のようにプログラムを少し改良したのですが


>Segmentation fault (コアダンプ)
>と出ました。解決法を教えてください。

で、そのポインタはいったいどこを指しているんですかね?

>int *count;

ポインタ変数用意しました。
# グローバル変数なので、全ビット0(つまり0x00000000(32Bitの場合)を指している)

>*count=0;

0x00000000から0x00000003に0(0x00000000)を書き込む(32Bitの場合)。
さて、そこのアドレスに書き込みが許可されているんですかね?
    • good
    • 0

>このようにしたら正確に実行することができました。

これってなぜですかね?
なぜかというとですね
動作が未定義だからです。
C言語の引数の評価順序は未定義のため
どこから始まるのか分かりません
そのためです。
だから答えは「未定義だから」となります。

>解決法を教えてください。
これはよく分かりませんが
普通
*++count
じゃなくて
*count++
と書きますね
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!