int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
此代码产生“0 1 2 3 4”的输出。它将 a[i] 与什么进行比较,它如何知道在数组的末尾停止而不是过去?
int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
此代码产生“0 1 2 3 4”的输出。它将 a[i] 与什么进行比较,它如何知道在数组的末尾停止而不是过去?
您的代码会导致未定义的行为。a[i]
如果非零,则表达式将评估为真,如果为零,则评估为假。当你运行它时,你很幸运,0
内存中的数组后面紧跟着一个单词,所以循环停止了。
它正在读取数组,而那里的内存恰好为零,这完全是幸运的。读取该数组的末尾是未定义的行为,结果可能随时改变,所以永远不要依赖它。
您可以将其a[i]
视为与 进行比较0
,它只是获取从内存中的位置检索到的数字,如果0
是存在于该内存中的值,则循环退出,如果是任何其他数字,则循环继续。
假设 anint
在系统上是 4 个字节。a
给定一个地址,让我们假装它是0xFF00
当我们尝试评估a[0]
我们检索存储在内存中的数据值时0xFF00
。a[1]
将从 memory0xFF04
等中检索数据。您的程序仅将值分配给前 5 个内存位置,因此当我们在这些位置之外检索数据时,它们可能是从0
to 的任何内容INT_MAX
。如果它恰好是,0
则循环退出,但是如果它恰好是其他东西,则循环继续。
您可以像这样调整程序以更好地查看它:
#include <iostream>
using namespace std;
int main() {
int a[5] = {1,2,3,4,5};
int i;
for (i = 0; a[i]; i++)
{
cout << "At memory address: " << &a[i]
<< " lives the value: " << a[i] << endl;
}
cout << "At memory address: " << &a[i]
<< " lives the value: " << a[i]
<< ", and this is why the loop ended." << endl;
return 0;
}