2017-10-29 8 views
-9
#include "stdafx.h" 
#include <iostream> 
using namespace std; 


int main() 
{ 
     int x[3]; 
     int i; 
     int pause; 
     for (i = 0; x[i] < 10; i++); { 
       x[i] *= x[i]; 
       cout << x[i]; 
     } 
     cout << x; 
     cin >> pause; 

    return 0; 
} 

どうしたのですか?なぜこのプログラムは-58684322800B5FD80を印刷しますか?

それはない万一印刷:

16 
25 
36 
{16, 25, 36} 

私はので、私はループを悪用している可能性がC++に非常に新しいです。

ありがとうございました

+5

なぜ印刷する必要がありますか?あなたはあなたの配列を初期化したことはありません。 – Jodocus

+0

あなたは配列の外に出ています。未定義のビヘイビアを呼び出すときに何を期待していますか? –

+0

配列を含む初期化されていないローカル変数は初期化されていません!*その値は* indeterminate *であり、C++でも*これらの値は[*未定義の動作*](http://en.cppreference.com/w/) cpp/language/ub)。 –

答えて

0

アレイの内容を初期化する必要があります。コンパイラはあなたのためにそれをしません。

それでも、ゼロ以外の値に初期化する必要があります。そうでないと、ループは終了しません。

あなたのアルゴリズムは、配列の範囲外でのあなたの書き出しに対しても脆弱です。私は決して2より大きくはないと確信していますか?私はそうではありません。

最後に、あなたのcout呼び出しは、ポインタ減衰のためにxの最初の要素のアドレスを出力します。実際の要素を出力するには、x [i]などを使用します。

0

初期化されていない変数への読み書きは、未定義の動作を生成します。

ご使用の場合は、アレイを初期化してからご使用ください。

int x[3] = {4, 5, 6}; 

また、それは配列の要素を反復処理する方法はありません:あなたの上

for (i = 0; x[i] < 10; i++);{} 

iは、配列のサイズ(3)ではない値10

未満であるかどうか確認する必要があります

セミコロンも削除してください;コードでは反復が行われず、for loop以下の本体が一度実行されるためです。

だからあなたのコードは次のようになります。私は何を望んでいた出力と何のためループは、私が値を持つ配列満たされないから、上記の推測として

int x[3] = {4, 5, 6}; 

    for (int i = 0; i < 3; i++) { 
     x[i] *= x[i]; 
     std::cout << x[i]; 
    } 

    std::cin.get(); 
  • 4, 5, 6を。

  • また、あなたはそのように配列の要素を印刷しないでください。

    のstd :: coutを< < X;配列の名前は、その最初の要素(要素0)へのポインタを減衰するため、その上

は、最初の要素x[0]のアドレスを印刷します。すべての要素が反復を使用し、印刷したり、割り当てるには

std::cout << *x; // will print 16 (4 * 4). Which is the first element. 

for(int i(0); i < 3; i++) 
    std::cout << x[i] << ", "; 
0

あなたの配列を初期化する必要があります。 ローカル変数に対してデフォルトの初期化は実行されません。 そのため、ガベージ値を印刷しています。

関連する問題