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

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

}

此代码产生“0 1 2 3 4”的输出。它将 a[i] 与什么进行比较,它如何知道在数组的末尾停止而不是过去?

4

3 回答 3

3

您的代码会导致未定义的行为。a[i]如果非零,则表达式将评估为真,如果为零,则评估为假。当你运行它时,你很幸运,0内存中的数组后面紧跟着一个单词,所以循环停止了。

于 2013-10-09T01:26:38.393 回答
0

它正在读取数组,而那里的内存恰好为零,这完全是幸运的。读取该数组的末尾是未定义的行为,结果可能随时改变,所以永远不要依赖它。

于 2013-10-09T01:26:45.273 回答
0

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

假设 anint在系统上是 4 个字节。a给定一个地址,让我们假装它是0xFF00当我们尝试评估a[0]我们检索存储在内存中的数据值时0xFF00a[1]将从 memory0xFF04等中检索数据。您的程序仅将值分配给前 5 个内存位置,因此当我们在这些位置之外检索数据时,它们可能是从0to 的任何内容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;
}
于 2013-10-09T01:42:17.643 回答