• ベストアンサー

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と なるのでしょうか?

noname#57479
noname#57479

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

  • ベストアンサー
  • 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% (2126/6288)
回答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

  • static 変数について

    static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }

  • staticで初期化した変数(?)を使って初期化

    次の3つのプログラム、1番目はコンパイルエラーになりますが、下2つはエラーになりません。1番目のプログラムのエラーメッセージ:初期化子が定数ではありません。 処理系にかかわらずそうだとしたら、その理由はなんでしょうか。 ---------------------------------- int main(void) { static int a=5; static int b=a; return 0; } ---------------------------------- int main(void) { static int a=5; int b=a; return 0; } ---------------------------------- int main(void) { int a=5; int b=a; return 0; }

  • Cのローカル変数でstatic以外の使い方?

    C言語の課題について教えてください [課題] 以下の関数がある。各関数の引数、変数は自由に設定していい ・int main() ・void func() ・Point *get() { /* 構造体のアドレスを返す */ } ・構造体 typedef struct { int x; int y; int h; int w; }Point; 問題 main関数から、func関数を経由して、get関数を経由し値を取得し、表示する 以下が考えたソースになりますが、これだと、 ローカル変数でstaticを使っているので、get関数が固定値ではなく、 取得のたびに値が変わるような場合には、だめだといわれました。 考えたのですがよくわからないので、どういう場合に駄目なのかと、 どのように修正すればいいのか教えてください。 #include <stdio.h> typedef struct { int x; int y; int h; int w; }Point; void func(Point **); Point *get(); int main(void){ Point *get; func(&get); printf("get.x:[%d]\n",get->x); printf("get.y:[%d]\n",get->y); printf("get.h:[%d]\n",get->h); printf("get.w:[%d]\n",get->w); return 0; } void func(Point **pw){ *pw = get(); printf("Wrapper: pw==%p\n",pw); } Point *get(void) { static Point pget; pget.x = 2; pget.y = 2; pget.h = 30; pget.w = 40; return &pget; }

  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • 変数の有効範囲について

    C言語の課題について教えてください [課題] 以下の関数がある。各関数の引数、変数は自由に設定していい ・int main() ・void Wrapper() ・void setdate(int *pset) { *pset = 10; } ・int *getdate() 問題 (1)main関数から、Wrapper関数を経由して、setdate関数を経由し値を取得し、表示する 意図としては、main内で、実態を宣言し、setdate関数内で値を代入し、main関数内で表示 (2)main関数から、Wrapper関数を経由して、getdate関数を経由し値を取得し、表示する 意図としては、main内でポインタを宣言し、getdate内で実態を宣言しそのアドレスをかえし、main関数内で表示 以下が考えたソースになります #include <stdio.h> int *getdata(void) { static int num = 100; printf("num[%p]\n",&num); } void setdata(int *p) { *p = 1; } void Wrapper(int *pw, int type) { if (type == 0) { *pw = *getdata(); } else { setdata(pw); } } int main(void) { int *get, set; Wrapper(get, 0); printf("get[%d]\n", *get); Wrapper(&set, 1); printf("set[%d]\n", set); return 0; } setdateの関数に関してはわかるのですが、getdateの関数は、実施したい内容とは異なると思うので、修正していただきたいです。 このやり方だと、参照しているアドレスはmain内で宣言した場所でありget関数で宣言した場所ではないと思うのです。

  • グローバル変数について

    ◎1--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; glb=30; printf("main a=%d glb=%d\n",a,glb); func(); return 0; } void func(void) { int b=88; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎1の実行結果----------------------- main a=20 glb=30 func b=88 glb=30 ------------------------------------- ◎2--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; func(); printf("main a=%d glb=%d\n",a,glb); return 0; } void func(void) { int b=88; int glb=30; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎2の実行結果----------------------- func b=88 glb=30 main a=20 glb=0 ------------------------------------- 以上2つのプログラムで、◎1は参考書を参考に作成したものです。 ◎1のプログラムで、グローバル変数glbの値をmain( )関数内で設定していたので、次に◎2のようにfunc( )という関数プロトタイプ内で、グローバル変数glbの値を設定し、main( )関数内のprintf文でも表示させようと思ったら、「glb=0」となってしまいました。 なぜこのようになってしまうか、教えてもらえたら嬉しいです。

  • static と externについて

    以下のようなプログラムを組んでいます。 //main.h static int hoge; void someOperation(); //hoge.cpp #include "main.h" extern int hoge; void someOperation() { hoge = 15; } //main.cpp #include <stdio.h> #include "main.h" extern int hoge; int main() { someOperation(); printf("%d\n",hoge); return 0; } このプログラムを実行したのですが、自分の予想した15という出力ではなく、不定値になるようなのです。 自分の予想では、someOperationで操作するhogeも、main内で操作するhogeも同じになるようにと思いexternをつけているのですが、なにがまずいのでしょうか? ご存知の方、ご教授お願いします。

  • 変数の使い方

    お聞きしたいのですが、下記の main関数、getaverage関数の両方で 変数averageを宣言してますが、 名前は同じだが、まったく別変数と考えて良いのですか? 教えてください。 #include <stdio.h> int getaverage(int data[10]); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int data[10]) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; } return average / 10; }

  • static変数のループ内での処理

    以下のc++ソース内で、static int b = 100;という式ですが、 1回目に、ここの処理を通ったときに静的変数が作成されると思います。 2回目のループのときに、ここでまたb=100と初期化されています。 ですが、ループを重ねるごとに、カウントが1増えていきます。 staticなので、これは期待通りの動作だとは思うのですが、なぜそうなるのかがわかりません。 コンパイラなどが、staticが頭に付いたものは、2度目のループ以降はこの行を無視するように しているのでしょうか? もしそうなら、他に暗黙のルール?のようなことが他にもあるのでしょうか? 考えるとさらにc++がわからなくなってきました。 #include <windows.h> #include <iostream> using namespace std; void test(){ int a = 100; cout << a << " " << &a << endl; static int b = 100; cout << b << " " << &b << endl; b++; int * abc = new int [10]; abc[0] = 9999; cout << abc <<" "<< &abc << " " << abc[0] << endl; delete [] abc; } int main(){ while (1){ Sleep(2000); test(); } } 教えてください。 よろしくお願いいたします。

  • クラス内の関数内static変数について

    クラス内の「staticではないメンバ関数内で定義される」static変数の初期化タイミングはいつでしょうか? 自分としてはクラスのインスタンス生成時に初期化されるものだと思っていたのですが、どうもそうでは無さそうだという現象に出会ったもので。 例えば以下のようなサンプルプログラムがあるとします。 --------------------------------------- class TA { public: void func(int i); }; void TA::func(int i) { static int d=0; d += i; std::cout << d << std::endl; } int main() { for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); } } --------------------------------------- これを実行した時、自分としては 1 2 3 2 4 6 という結果を期待していた訳ですが、実際には 1 2 3 5 7 9 という結果になりました。 ということは、もしかしてメンバ変数ではなくともクラス内に現れるstatic変数はstaticなメンバ変数と同等ということなのでしょうか? 実際、上記ソースのforループ内にもう一つclass TAのインスタンスtbを追加してみると、 --------------------------------------- for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); TA tb; tb.func(i); tb.func(i); tb.func(i); } --------------------------------------- 1 2 3 4 5 6 8 10 12 14 16 18 となりました。 (まぁstaticではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

専門家に質問してみよう