• ベストアンサー

static変数の扱いについて

例えば、下記のような場合、 main(){ ・・・ while(A==B){ kakunin1();//この関数を何度か繰り返し呼び出す } } int kakunin1(){ static int sample = 0.0; kakunin2(&sample); sample++; //(1) return(sample); } void kakunin2(*sample){ *sample++; //(2) } まずはじめに(2)でsample=1になって、 次に(1)で2になって、 今度mainからkakunin1がコールされると、sampleの値は2を 保持しているのでしょうか?つまりその後(2)でさらにsample=3と なるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・イメージ的にはそうなりそうですが、2箇所間違っています。 ・その1  間違い⇒static int sample = 0.0;  正しい⇒static int sample = 0;  ※int型の変数なので 0.0 の小数値は代入できません。double型なら 0.0 で良いが…。 ・その2  間違い⇒*sample++; //(2)  正しい⇒(*sample)++; //(2)  ※『++』演算子よりも『*』演算子の方が先に評価されます。このため sample 変数を   インクリメントしていません。つまり『*sample』を参照してから sample ポインタを   インクリメントしています。正しくはカッコをつけるか、『*sample += 1;』と記述して下さい。 ・上記の2点を直すと >まずはじめに(2)でsample=1になって、 >次に(1)で2になって、 >今度mainからkakunin1がコールされると、sampleの値は2を >保持しているのでしょうか?つまりその後(2)でさらにsample=3と >なるのでしょうか?  ↑  と同じ動作になります。 ・あとソースの省略の仕方がちょっと気になるね。  kakunin2() 関数の引数の型くらいは省略しないでも良い気がします。 ・以上。

noname#57479
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★回答者 No.1 です。 ・質問のソースのままでは kakunin1() が呼び出されさらに kakunin2() が呼ばれても  『sample=3』にはなりません。  よって、  1回目…sample=1  2回目…sample=2  3回目…sample=3  4回目…sample=4  となります。 ・回答者 No.3 さんもアドバイスしていますが、 >*sample++ と (*sample)++ とでは、意味が全く異なります。  ↑  という事です。  ポインタの確認という事なのでこの質問の回答は『sample=3』にはなりません。  って事になります。もし、kakunin2() を呼ばれたら『sample=3』にするには回答No.1の  『その2』にあるようにカッコをつけるか『(*sample)++;』、『*sample += 1;』という  記述をして下さい。私は分かりやすいように普段『*sample += 1;』という記述を使います。 ・以上。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

> * が先に評価されるんで、間違いと正解に差がないんですが。。。 *sample++ と (*sample)++ とでは、意味が全く異なります。 前者は、sampleが指している領域を参照した後、「sample」をインクリメントします。 後者は、「sampleが指している領域に格納している値」をインクリメントします。

すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>・その2 > 間違い⇒*sample++; //(2) > 正しい⇒(*sample)++; //(2) kakunin2() 関数の書き方がおかしいだけじゃない? * が先に評価されるんで、間違いと正解に差がないんですが。。。 voidkakunin2(int* ptr) {  *ptr++; } としたかったと予想。

すると、全ての回答が全文表示されます。

関連するQ&A