#include <stdio.h> int countfunc(void); int main(void) { countfunc(); countfunc(); countfunc(); return 0; } int countfunc(void) { int count = 0; /* 初期化 */ count++; printf("%d\n",count); return count; }
実行結果: 1 1 1
上記コードの実行結果どう理解すればよろしいでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
どう理解すればよろしいでしょうか
「static」を使う、という答えはもう出ています。
なぜ、その答えが分かるのか、理解の仕方を言いますね。
プログラムは思い通りに動かず、書いた通りに動きます。
そこで、その「書いた通り」がどうなっているのか、確認すれば良いわけです。
どうすればいいかというと、(人力)コンパイラやインタプリタの立場になって、
つまり、相手の立場で考えます。具体的には、一行ずつ逐次でコードを追います。
そうすると、(本当のコンパイラではなく、単純化したものですが)
下のように読むわけです。関数を三回呼び出しているから、三回初期化されている。
そのつど初期化したくないなら、staticというわけで、冒頭の答えにたどり着きます。
サンプルコードを使うのは、たぶん今回だけでしょうけど、
この逐次で追う方法は、プログラミングでずっと使えるので、覚えておきましょう。
c
1int main(void) 2{ 3 countfunc(); 4int countfunc(void) 5{ 6 int count = 0; /* 初期化 */ 7 count++; 8 printf("%d\n",count); 9 return count; 10} 11 countfunc(); 12int countfunc(void) 13{ 14 int count = 0; /* 初期化 */ 15//(以下略)
投稿2017/11/30 08:31
総合スコア5592
0
理解もなにも、countfuncに飛び込むたんびに countを0にして/+1して/プリントしてるだけ。
count値を保持したいなら、
int count = 0;
改め static int count = 0;
投稿2017/11/30 00:18
編集2017/11/30 00:19総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
countfunc関数の戻り値を使いたいのであれば、例えば以下のようにする。
C
1int countfunc(int cnt); 2 3int main(void) 4{ 5 int count = 0; /* 初期化 */ 6 count = countfunc(count); 7 count = countfunc(count); 8 count = countfunc(count); 9 return 0; 10} 11 12int countfunc(int cnt) 13{ 14 cnt++; 15 printf("%d\n",cnt); 16 return cnt; 17}
戻り値は使わずに、引数で全て賄うのであれば、以下のような感じ。
C
1void countfunc(int *cnt); 2 3int main(void) 4{ 5 int count = 0; /* 初期化 */ 6 countfunc(&count); 7 countfunc(&count); 8 countfunc(&count); 9 return 0; 10} 11 12void countfunc(int *cnt) 13{ 14 *cnt++; 15 printf("%d\n",*cnt); 16} 17
投稿2017/11/30 08:13
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。