2017-07-16 8 views
-2

次のコードがありますが、なぜコンパイラが配列サイズよりも多くの要素を表示するのか混乱しています。あなたの条件は、ここで「インデックスが配列の最後ではない」というより「要素が非ゼロの値を持っている」であるため、アレイに格納されているものに問題があります

# include <iostream> 
using name space std; 

int main() 
{ 
    int arr[]={1,2,34,5}; 

    for(int i=0; arr[i]; i++) 
    { 
     cout << arr[i] << endl; 
    } 
} 
+0

「i o stream」のように間隔が離れているのはなぜですか?これはどのようにしてコンパイルされますか?すべての小さな文字のカウントでプログラミングでは、ほとんどの間違いでさえ気をつけてください。これらのことは、コードの意味を予測不能かつ深刻な方法で変更する可能性があります。 – tadman

+1

このプログラムをどのようにコンパイルできますか? '#include 'ではありません。 '#include < iostream >'となります。 'cout << arr [i] << end l;'ではありません。 'cout << arr [i] << endl;'になります。次に、このプログラムをコンパイルするとエラーが発生します。 –

+0

forループとその終了条件を読んでください。これが正しく動作するためには、配列は0で終わる必要があります。つまり、0に達するか、プログラムがクラッシュするまでは、 'があります。 –

答えて

1

あなたは配列の終わりをオフに歩いています。

for (int i = 0; i < 4; ++i) 

私は強くとして、あなたではなく、単純なイテレータを使用することができ、あなたがそのようなstd::vector、このような問題のための標準ライブラリのコンテナを使用することをお勧めします。これらは、イテレータを使った単純なパターンに従うfor_eachのようなものがあるので、このように上がるのが難しくなります。

+1

または 'for(auto x:arr)... ' – juanchopanza

+0

@juanchopanza標準ライブラリを使用する別の大きな理由。より新しいコンパイラがそれをサポートしていますので、使用するのが楽しいです。 – tadman

0

あなたはこの方法を試すことができます。

#include <iostream> 
using namespace std; 

int main() 
{ 
    int arr[]={1,2,34,5}; 
    int n = sizeof(arr)/sizeof(arr[0]); 

    for(int i=0;i<n;i++) 
    { 
     cout<<arr[i]<<endl; 
    } 
    return 0; 
} 
0

ライン

for(int i=0;arr[i];i++) 

はあなたがarr、このような内の配列のすべての要素ということを初期化した

for(int i=0;arr[i] != 0;i++) 

に相当します有効な配列インデックスはゼロではありません。したがって、範囲外のインデックスを使用してarrにアクセスすると、はtrueの唯一の方法になります。しかし、これはプログラムで見られている未定義の動作の原因です。

C++ 11コンパイラにアクセスできる場合は、range- forループを使用して配列のすべての要素にアクセスします。

for (auto el : arr) 
{ 
    // Use el 
} 

あなたがC++ 11コンパイラへのアクセス権を持っていない場合は、範囲外の配列にアクセスする前にループを切断するために、配列のサイズを使用します。

size_t size = sizeof(arr)/sizeof(arr[0]); 
for (size_t i = 0; i < size; ++i) 
{ 
    int el = arr[i]; 
    // Use el 
} 
関連する問題