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

プログラミングの授業のペーパーテスト
実行結果を答えろ
#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}

なんでfunc1:m[]={2,20}になるんですか?
2はわかるのですが20はどうやって20になるのか分からないです

A 回答 (3件)

> 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

それは, 本当にこの「プログラム」を「実行」した「結果」なのかな?



どう見ても, 「実行」できるとは思えないんだが.

あと「答えろ」ってあなたが命令する立場なのか?
    • good
    • 1
この回答へのお礼

ペーパーテストの問題をただ書いただけです

お礼日時:2022/06/16 21:52

> なんでfunc1:m[]={2,20}になるんですか?



mainで定義されてるx[] = {10, 20}; がfunc1の実引数になってるから。

/* main 内 */
func1(x); // <- x[] = {10, 20}; が引数として渡される

/* func1 内では x[] = {10, 20}; は m[] として認識される

int x[ ] = {1,2};  // <- このx と main のxは別物
m[0] = x[1]; // mはmain内のxなのでm[] = {10, 20};の0番目に(func1内の)x[1]が代入される => m[] = {2, 20}; になる
    • good
    • 0
この回答へのお礼

分かりやすい説明ありがとうございます
func2: m[]={2,20}とmain:x[]={2,20}
がなんでそうなるのか分かりません
お時間がもしあったら教えて欲しいです
あとは理解しました

お礼日時:2022/06/16 21:51

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