• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:多次元配列について質問)

多次元配列についての質問と解答

このQ&Aのポイント
  • Javaの参考書に掲載されていた問題についての質問です。
  • 質問では、問題文と解答ソースコードが示されており、特にCの手順についての疑問があります。
  • 解答ソースコードでは、2次元配列の各列の合計を求めるための処理が実装されていることに疑問を持っています。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

まあ、確かに多少の語弊はあったかもしれませんが。 > 質問者さんが、加算して代入という意味も含めて「代入」と言っているのならその解釈であっていると思います。 深読みして解釈すればそうかもしれませんけど、やはり「代入」と言われたら、「代入先の内容を代入元にそのまま置き換える」という動作を思い浮べます。こういう場所では、「用語」を別の意味で使われると、誤解の元ではないでしょうか。 特に、質問者さんは、過去の質問からして「用語」にはこだわる方のようなので。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

ですから「再代入」ってなんですか? 私には「代入を再度行う」という意味にしかとれません。 「代入」自体は計算など行いません。 少なくとも、私は「代入」という言葉を、「変数(またはそれに相当するもの)の値を被代入値に変更する。それまでの変数値は放棄される」という意味で使っています。それ以外の意味で使うのなら、代入、再代入の定義をしてください。 あなたの解釈が正しかったとしても、それが相手に正しく伝えられなければ、「あなたの解釈が間違っているのか、理解は正しいけど表現できてないだけなのか?」の判断などできません。 できれば、既にある用語は既にある意味で使っていただきたいのですが。 > sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか? 私の「代入」では、「再代入」したら、sum[0]がそれまでの値を廃棄してn[0](=p[1][0])の値になるだけで、集計など行いません。 その結果、最終的に最後に代入した sum[x] = p[4][x] になるだけです。 私の「代入」を使って表現するなら sum[0]にn[0](=p[1][0])を「加えた値がsum[0]に代入」されるので、縦方向に累計されていく となります。

wantanton
質問者

補足

丁重なご回答誠にありがとうございます! すいません、、用語の使い方気をつけます。 このような理解ならだいじょうぶですか? 「例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])を加えた値がsum[0]に代入され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])を加えた値がsum[0]に代入されるので、縦方向に累計されていく」 ようやくわかってきました!

すると、全ての回答が全文表示されます。
  • axsies
  • ベストアンサー率64% (38/59)
回答No.3

No1の方の「代入されない」というのは少し誤解を生みそうですが、 質問者さんが、加算して代入という意味も含めて「代入」と言っているのならその解釈であっていると思います。 a+=xはa=a+xと等価です。(多次元配列まで進んでいるならすでにやっているとは思いますが一応) 結局議論となっているコードを実行順通りに書けば、 sum[0]+=p[0][0] sum[1]+=p[0][1] sum[2]+=p[0][2] sum[3]+=p[0][3] sum[0]+=p[1][0] sum[1]+=p[1][1] sum[2]+=p[1][2] ...(略) sum[1]+=p[4][1] sum[2]+=p[4][2] sum[3]+=p[4][3] です。 挙動がよくわからないときは、頭の中で考えるより 実際にデバッガで1ステップごとに追いかけたり、 計算途中を出力してみた方が理解が早い事が多いです。 int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ System.out.printf("sum[%d](=%d) += %d\n", j,sum[j],n[j]); // ←こんな感じの出力を適当に挟んでみる(書式は好き好きですが) sum[j]+=n[j]; } }

wantanton
質問者

補足

「例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])が「再代入」され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか?」

すると、全ての回答が全文表示されます。
noname#147388
noname#147388
回答No.2
wantanton
質問者

お礼

ごめんなさい、、 僕質問のマナーがなってませんでした。。

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> sum[0]にn[0](=p[0][0])が代入 > sum[0]にn[0](=p[1][0])が再代入 「代入」はされません。 参考書やリファレンスマニュアルで「 += 」という演算子(複合代入演算子)の意味を調べてください あと > int[]sum=new int[p[0].length]; としたときに、sumの初期状態がどうなっているか調べてください

wantanton
質問者

お礼

いつもご回答誠にありがとうございます! 以下で、回答で理解したことを確認させていだきます。 確認1:>「代入」はされません。 「再代入」ですよね? つまり、質問文を訂正すると 「例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])が「再代入」され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか?」 このようになりますよね? 確認2:kmeeさんんが > int[]sum=new int[p[0].length]; >としたときに、sumの初期状態がどうなっているか調べてください 上記の問いかけをした意図は、「sumの配列の初期化規定値が0になっているから、調べてごらんなさい。だからこそ、sum[0]にn[0](=p[0][0])に『再代入』ができるんだ。」ということですよね?kmeeさんが、僕が「代入」と表現した理由として、初期化規定値で0になっていることがわからないため(再代入は初期化されてないとできないから)だと思ったから、そのような問いかけをされたんですよね?

wantanton
質問者

補足

あ、、間違えてお礼に書いちゃいました。。 ごめんなさい!補足待ってます!

すると、全ての回答が全文表示されます。

関連するQ&A