フィボナッチ数列と関数を呼び出した回数を求めるプログラムを書いたのですが、下記のプログラムでは関数を呼び出した回数がカウントされず次の部分
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
#if 1 #elseの意味について
-
配列を関数に渡す方法
-
C言語・アルゴリズムの勉強法(...
-
C言語のwhile文を使った素数判...
-
scanf関数を用いての加減乗除%...
-
C言語階乗の総和を求める
-
C言語 数字以外を入力させない...
-
配列を使って魔方陣
-
for文
-
C言語 プログラム
-
while文について、c言語...
-
c言語プログラミングで1から100...
-
販売金額の合計などを求める問題
-
C言語でfor文を用いたプログラ...
-
プログラムでの数字につく”f”の...
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報