- ベストアンサー
このコードは省いてもよいのでしょうか?
下記のプログラムは2行3列の行列と3行2列の行列の積を求めるものです。 int main(void) { int i, j, k; int mx[2][3] = {{1, 2, 3}, {4, 5, 6}}; int my[3][2] = {{1, 5}, {5, 3}, {8, 1}}; int mz[2][2] = {0}; for(i=0; i<2; i++) { for(j=0; j<2; j++) { mz[i][j] = 0; for(k=0; k<3; k++) mz[i][j] += mx[i][k] * my[k][j]; } } for(i=0; i<2; i++) { for(j=0; j<2; j++) printf("%3d", mz[i][j]); putchar('\n'); } return (0); } 【質問】 main関数冒頭で int mz[2][2] = {0}; と初期化されていますが、後に出てくるforループ中の mz[i][j] = 0; は結局同じことをして無駄なコードではないのでしょうか? このコードを省いたプログラムをコンパイルして実行しても結果には影響ありませんでした。 とはいえ、考えが合っているか不安なので回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
どちらでもよいのですが、初期化は極力使用する箇所に近いところで行った方が見通しがよくなります。それに、最初のループの前にmzに何か書き込むような処理が入れば、たちまち破綻してしまいます。 これが、mzの各要素を同じ値に初期化するのではなく、バラバラの値に初期化するのであれば、また話は別です。
その他の回答 (3)
- koko_u_
- ベストアンサー率18% (459/2509)
>ところで、「サマリー」とは何ですか? 集計という意味で使ったけど、あんまり適切ではなかったかも。
お礼
そうですか…回答ありがとうございました!
- koko_u_
- ベストアンサー率18% (459/2509)
>なぜ、「int mz[2][2] = {0};」のほうを省いた方が良いのですか? >どちらでも良い気がするのですが… コードとしてはどちらを省いても動作するでしょう。 for(i ... ) - for (j ... ) ループの中の mz[i][j] = 0; の方が 後続の for(k ... ) ループでサマリーする前の初期値であることがより明確だと思われます。 int mz[2][2] = {0}; の初期化を省けば、for ループの境界を間違えたときに 結果が明らかにおかしいのでバグに気付きやすいかもしれません。
お礼
回答ありがとうございます!! >for(i ... ) - for (j ... ) ループの中の mz[i][j] = 0; の方が >後続の for(k ... ) ループでサマリーする前の初期値であることがより明確だと思われます。 後続の for(k=0; k<3; k++) mz[i][j] += mx[i][k] * my[k][j]; でmz[i][j]を使っているから、その直前で初期化したほうが良いということですか? ところで、「サマリー」とは何ですか?「+=」でサム(sum:合計を求める)するから「サマリー」ですか? 教えて頂けないでしょうか?
- jacta
- ベストアンサー率26% (845/3158)
省くならむしろ > int mz[2][2] = {0}; の初期化子の方ではないでしょうか。
お礼
さっそくの回答ありがとうございます!! なぜ、「int mz[2][2] = {0};」のほうを省いた方が良いのですか? どちらでも良い気がするのですが… 教えて頂けないでしょうか?
お礼
回答ありがとうございます!! 初期化した後に、それを使用する前に書き換えられるのを防ぐために、使用する箇所に近い所の方がいいんですね! 勉強になりました!今後参考にさせて頂きます! 回答本当にありがとうございました。