我有以下代码,我很困惑为什么编译器显示的元素多于数组大小。
# 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 :(得分:1)
你离开阵列的末尾是因为你的条件是&#34;元素具有非零值&#34;而不是&#34;索引不在数组的末尾&#34;。
for (int i = 0; i < 4; ++i)
我强烈建议您使用标准库容器来解决此类问题,例如std::vector
,因为您可以使用简单的迭代器。这些因为像for_each
那样使用迭代器遵循简单模式之类的东西变得更难绊倒。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
该行
for(int i=0;arr[i];i++)
相当于
for(int i=0;arr[i] != 0;i++)
您已初始化arr
,以便有效数组索引中数组的所有元素都不为零。因此,arr[i] != 0
true
的唯一方法是使用越界索引访问arr
。但是,这是导致未定义行为的原因,这是您在程序中看到的。
如果您有权访问C ++ 11编译器,请使用范围 - 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
}