• ベストアンサー

アドバイスください。

10個の1桁の整数を入力して、入力した順番に並べたいのですが 最後の出力のところで番地が表示されてしまいます。 どうしてでしょうか? #include<iostream> using namespace std; int main(void){ int a; int b[10]; for(int i=0; i<9; i++){ cin >> a; b[i]=a; } cout << b; return 0; }

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

当然です。 cout << b としているからです・ bは10個の配列全体を表現する場合もありますが (ex sizeof (b) / sizeof (b[0]) == 10 です この場合bはb配列全体を表現しています。) 通常は”b配列の先頭要素が格納されている番地(アドレス)"と解釈します。 b配列全体を出力したいなら ループで回る必要があります。 他にも誤記があります。 for(int i=0; i<9; i++){ cin >> a; b[i]=a; } これではb[9]に値が入りません。 for(int i=0; i<10; i++){ ... } が正解と言いたいところですが... こういう風に書くとbを20個に拡張した時 バグの温床になってしまします for(int i=0; i< sizeof (b) / sizeof (b[0]); i++){ とすれば正解と言えるでしょう ちなみに これだとループの度に割り算して効率が悪いのでは? と思われるかもしれません。 心配ご無用です。 最近のC++は最適化がすごいので こんなコンパイル時に計算できるものはすべてコンパイル時に 計算してしまいます。 従って、実行時の効率は直接10を指定したものと変わりません。 ちなみに、 sizeof (b) / sizeof (b[0]) は、長いし、わかりにくい(でも一応定石ですが..)し、 絶対イヤ!!! という人には #define ARRAY_OF(a) (sizeof (a) / sizeof ((a)[0])) がお勧めです。 これなら for(int i=0; i< ARRAY_OF (b); i++){ でぐっと短縮されました。 これも効率は落ちませんのでご安心を。 で、ここまでくれば 最後のb配列も簡単に出力できます for (int i = 0; i < ARRAY_OF (b); i++) { cout << b[i]; } です。 以上をまとめます ======================ここから ソース =========================== #include<iostream> using namespace std; // 配列の要素数を計算します #define ARRAY_OF(a) (sizeof (a) / sizeof ((a)[0])) int main(void) { int b[10]; // 配列全体に値を入れます for (int i = 0; i < ARRAY_OF (b); ++i) { int a; // aはループの内部でしか利用しないので           // ループの外で宣言するのは全く意味がありません           // バグの温床となりやすいので変数のスコープは           // できるだけ狭くしましょう     cin >> a; a[i] = b; }     // 配列全体を出力します for (int i = 0; i < ARRAY_OF (b); ++i) {    cout << b[i];        } return 0; } ================ ソースはここまで ==============================

mutekisama
質問者

お礼

詳しい解説ありがとうございます。 またわからないことがあったらご指導お願いします。

その他の回答 (1)

  • Nereus
  • ベストアンサー率45% (17/37)
回答No.1

cout << b; この行がおかしいです。 C/C++言語の規則として、単独で現れた配列名は、その先頭要素の ポインタとなります。 ですから番地が表示されて当然なのです。 意図する動作は以下のように記述します。 for (int i = 0; i < 10; i++) {   cout << b[i]; } cout << endl; ※ちなみに、for文の条件判定式が間違ってますね。 配列の要素数が10なので、i < 10とするかi <= 9とします。

mutekisama
質問者

お礼

入力の部分がないんですけど・・・ そこはどうしたらいいんでしょうか?

関連するQ&A