アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミングペーパーテスト
次の問題の実行結果を答えろ

#include int x[ ] = {100,200};
void func1(int m[ ]);
void func2(int m[ ]);

int main(void)
{
int x[ ] = {10,20};

func1(x);
printf("main : x[] = {%d, %d}\n",x[0],x[1]);
func2(x);
printf("main : x[] = {%d, %d}\n",x[0],x[1]);
return 0;
}

void func1(int m[ ])
{
int x[ ] = {1,2};
m[0] = x[1];
printf("func1: m[] = {%d, %d}\n",m[0],m[1]); printf("func1: x[] = {%d, %d}\n",x[0],x[1]);
}

void func2(int m[ ])
{
x[0] = m[1];
printf("func2: m[] = {%d, %d}\n",m[0],m[1]);
printf("func2: x[] = {%d, %d}\n",x[0],x[1]);
}

実行結果
func1: m[]={2,20}
func1: x[]={1,2}
main : m[]={2,20}
func2: m[]={2,20}
func2: x[]={20,200}
main : x[]={2,20}

func2: m[]={2,20}とmain:x[]={2,20}
がなんでそうなるのか分かりません
あとは理解しました

A 回答 (1件)

> func2: m[]={2,20}とmain:x[]={2,20}


> がなんでそうなるのか分かりません

まずfunc1を実行した時点でmain内のxは書き換えられちゃうのね。
そういうのを「破壊的変更」っつーんだけど。
func1を実行した時点で、main関数内のxはx[] = {2, 20}; になる。
次にそのまま今度はfunc2の引数に渡されて、そこではmで参照される。
ここで注意事項だけど、func2内で参照されるxはmain関数内のxじゃない。大域変数のxなんだ。
今、大域変数のxは

int x[ ] = {100,200};

なんだけど、func2の

x[0] = m[1];

のせいで、大域変数のxはx[] = {20,200}; に書き換えられる。
一方、func2内ではmは何も変化しない。据え置きのまま、だ。
mが何も変化しない、って事は受け渡されたmain内のxも何も変更がなかった、って事でこの時点で

func2: m[]={2,20};
main:x[]={2,20};

って事になる。

まぁ、でも正直言ってあまり良い問題じゃないと思う。
良くてパズルだな。
基本的に「変数を同名にしたり」「破壊的変更を多用する」ようなプログラムを書くのは避けるべきだと思うんで、悪習を促すんつもりじゃないのならなら、この問題は単なるトリビアルなモノかなぁ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!