![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
フィボナッチ数列と関数を呼び出した回数を求めるプログラムを書いたのですが、下記のプログラムでは関数を呼び出した回数がカウントされず次の部分
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;
}
No.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は消滅して、他のプログラム部分に影響を及ぼす心配はなくなります
No.3
- 回答日時:
グローバルなポインタで初期値を与えなかった場合「0 で初期化」するので「ナルポインタ」になるんだけど, それが「全ビット0」という
保証はないです>#2. あと, *++count; と *count++; は意味が違いますよね>#1. どっちにしても本来想定した動作にはならないのですが.No.2
- 回答日時:
>また、カウントをポインタを使って行おうとして、次のようにプログラムを少し改良したのですが
>Segmentation fault (コアダンプ)
>と出ました。解決法を教えてください。
で、そのポインタはいったいどこを指しているんですかね?
>int *count;
ポインタ変数用意しました。
# グローバル変数なので、全ビット0(つまり0x00000000(32Bitの場合)を指している)
>*count=0;
0x00000000から0x00000003に0(0x00000000)を書き込む(32Bitの場合)。
さて、そこのアドレスに書き込みが許可されているんですかね?
No.1
- 回答日時:
>このようにしたら正確に実行することができました。
これってなぜですかね?なぜかというとですね
動作が未定義だからです。
C言語の引数の評価順序は未定義のため
どこから始まるのか分かりません
そのためです。
だから答えは「未定義だから」となります。
>解決法を教えてください。
これはよく分かりませんが
普通
*++count
じゃなくて
*count++
と書きますね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
行列をべき乗させるプログラム
-
for文の中にswitch文はいれられ...
-
C言語 プログラム
-
c言語のプログラムで
-
平均身長のプログラミング
-
getcの改行判定
-
C言語 数字以外を入力させない...
-
十進BASICのプログラムについて
-
円周率 πの値
-
C言語で、条件をつけて総和を求...
-
for文
-
VHDLで、case文とwhen文のどち...
-
c言語のリダイレクトによる円...
-
吸湿性のあるものを天秤で秤量...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
マイナスからプラスへ転じた時...
-
【C言語教えてください】sin波...
-
O(n log n)について2
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
初心者です。for文、if文を使っ...
-
c言語プログラミングで1から100...
おすすめ情報