int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
此代码生成“0 1 2 3 4”的输出。 它与[i]的比较是什么,以及它如何知道在阵列的末尾停止而不是过去?
答案 0 :(得分:3)
您的代码会导致未定义的行为。如果非零,则表达式a[i]
将评估为true,如果为零则表达为false。当你运行它时,你很幸运地在你的数组内存后面有一个0
字,所以循环停止。
答案 1 :(得分:0)
它正在读取数组,而那里的记忆恰好是零,纯粹是运气。读取该数组的结尾是未定义的行为,结果可能随时改变,所以永远不要依赖它。
答案 2 :(得分:0)
您可以将a[i]
视为与0
进行比较,它只是提取从内存中的位置检索到的数字,如果0
是生活在该内存中的值,那么循环退出,如果是循环继续的任何其他数字。
假设int
在系统上是4个字节。 a
被赋予一个地址,当我们尝试评估0xFF00
我们检索存储在内存a[0]
中的数据值时,我们假装它是0xFF00
。 a[1]
将从内存0xFF04
等检索数据。您的程序只会将值分配给前5个内存位置,因此当我们检索超出这些位置的数据时,它们可以是0
的任何内容。到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;
}