int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
Этот код производит вывод "0 1 2 3 4". Что он сравнивает с [i] и как он знает, чтобы остановиться в конце массива и не переходить?
Вы код вызывает неопределенное поведение. Выражение a[i]
будет оцениваться как истинное, если отличное от нуля и false, если оно равно нулю. Когда вы запустите его, вам повезет, что сразу после вашего массива есть 0
слов, поэтому цикл останавливается.
Это чтение за массивом, и память там просто оказывается нулевой, просто удачей. Чтение за концом этого массива - неопределенное поведение, и результат может измениться в любое время, поэтому никогда не полагайтесь на него.
Вы можете думать о том, a[i]
сравнивается с 0
, он просто извлекает число, полученное из местоположения в памяти, и если 0
- это значение, которое живет в этой памяти, тогда цикл выходит, если это любой другой номер, цикл продолжается.
Предположим, что int
составляет 4 байта в системе. a
задан адрес, позволяет делать вид, что это 0xFF00
когда мы пытаемся оценить a[0]
мы извлекаем значение данных, хранящееся в памяти 0xFF00
. a[1]
будет извлекать данные из памяти 0xFF04
и т.д. Ваша программа назначает только значения для первых 5 мест памяти, поэтому, когда мы извлекаем данные за пределами этих местоположений, они могут быть INT_MAX
от 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;
}
a[i]
сравнивается с 0!TEST
для сравнения регистра с самим собой. stackoverflow.com/questions/6002079/...