For循环条件是一个没有比较的变量

时间:2013-10-09 01:24:54

标签: c++

int a[5] = {1,2,3,4,5};

for (int i = 0; a[i]; i++)
{
    cout << i;

}

此代码生成“0 1 2 3 4”的输出。 它与[i]的比较是什么,以及它如何知道在阵列的末尾停止而不是过去?

3 个答案:

答案 0 :(得分:3)

您的代码会导致未定义的行为。如果非零,则表达式a[i]将评估为true,如果为零则表达为false。当你运行它时,你很幸运地在你的数组内存后面有一个0字,所以循环停止。

答案 1 :(得分:0)

它正在读取数组,而那里的记忆恰好是零,纯粹是运气。读取该数组的结尾是未定义的行为,结果可能随时改变,所以永远不要依赖它。

答案 2 :(得分:0)

您可以将a[i]视为与0进行比较,它只是提取从内存中的位置检索到的数字,如果0是生活在该内存中的值,那么循环退出,如果是循环继续的任何其他数字。

假设int在系统上是4个字节。 a被赋予一个地址,当我们尝试评估0xFF00我们检索存储在内存a[0]中的数据值时,我们假装它是0xFF00a[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;
}