
プログラミングの授業のペーパーテスト
実行結果を答えろ
#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になるのか分からないです
No.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};
って事になる。
まぁ、でも正直言ってあまり良い問題じゃないと思う。
良くてパズルだな。
基本的に「変数を同名にしたり」「破壊的変更を多用する」ようなプログラムを書くのは避けるべきだと思うんで、悪習を促すんつもりじゃないのならなら、この問題は単なるトリビアルなモノかなぁ。
No.2
- 回答日時:
それは, 本当にこの「プログラム」を「実行」した「結果」なのかな?
どう見ても, 「実行」できるとは思えないんだが.
あと「答えろ」ってあなたが命令する立場なのか?
No.1
- 回答日時:
> なんで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}; になる
分かりやすい説明ありがとうございます
func2: m[]={2,20}とmain:x[]={2,20}
がなんでそうなるのか分かりません
お時間がもしあったら教えて欲しいです
あとは理解しました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = {
C言語・C++・C#
-
C言語のバイナリファイルに関する質問
C言語・C++・C#
-
C言語について
C言語・C++・C#
-
4
C言語のwhileを使ってプログラムを組みたいです!自分でやってみたのですが答えが合わないので教えて
C言語・C++・C#
-
5
プログラミングのC言語についてですが 全く分かりません。 どなたか教えてくれないでしょうか、、?
C言語・C++・C#
-
6
至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、
C言語・C++・C#
-
7
[C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について
C言語・C++・C#
-
8
1. 仮想CPU「exmini」を使用して,「$dataからn減算する」プログラムを作成してください
C言語・C++・C#
-
9
c++をcより使うときの理由をおしえてください。
C言語・C++・C#
-
10
C言語について。
C言語・C++・C#
-
11
C言語のエラーについて
C言語・C++・C#
-
12
至急教えてください!プログラミングの問題です。 正の整数nを入力させると、1からnまでの整数を出力し
C言語・C++・C#
-
13
至急お願いします。プログラミングの問題です。 malloc 関数を使って教えてください。 入出力例1
C言語・C++・C#
-
14
至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最
C言語・C++・C#
-
15
(C言語・配列)date[i]の分散を計算する場合
C言語・C++・C#
-
16
コンピュータでいう「割り込み」とはどういう意味ですか?わかりやすく教えてほしいです。
C言語・C++・C#
-
17
(C言語)めちゃくちゃな値になってしまいます。
C言語・C++・C#
-
18
未解決の外部シンボル _printfが関数_mainで参照されました
C言語・C++・C#
-
19
C言語 少しの疑問
C言語・C++・C#
-
20
GASで◯月第◯週→何日から何日と返ってくる関数
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
整数データの配列から同じ値の...
-
5
return 1L
-
6
足して100になるような乱数のア...
-
7
課題なんですが・・・
-
8
std::set<int> で、ある値が何...
-
9
if と配列の組み合わせ
-
10
C言語の配列をC++のvectorに高...
-
11
C言語について。 同じ年内で経...
-
12
配列変数のポインターが勝手に...
-
13
構造体の勉強中です 合計点の高...
-
14
C言語、行列の積を求めるプログ...
-
15
(int *)の意味
-
16
c 言語 B tree
-
17
非常に
-
18
system関数がうまくいかない
-
19
線形補間 2次元テーブル C言語...
-
20
ゴールドバッハの予想のプログラム
おすすめ情報
公式facebook
公式twitter