プログラミングの授業のペーパーテスト
実行結果を答えろ
#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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
「{ } で囲むだけ」は正しい?
-
実数の整数部,小数部の取得
-
c言語の配列を使ってサイコロを...
-
if と配列の組み合わせ
-
C言語で行列の積を計算できるよ...
-
入力を待たずにstdinの監視をし...
-
C言語 エラーの原因がわからな...
-
C++でvectorにテキストファイル...
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
return 1L
-
PowerShellがうまくいかない
-
C言語の配列をC++のvectorに高...
-
野球の対戦成績のテーブル表示...
-
部分行列の抜き出し(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報