Для цикла условие является переменной без сравнения

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

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

}

Этот код производит вывод "0 1 2 3 4". Что он сравнивает с [i] и как он знает, чтобы остановиться в конце массива и не переходить?

Теги:

3 ответа

3
Лучший ответ

Вы код вызывает неопределенное поведение. Выражение a[i] будет оцениваться как истинное, если отличное от нуля и false, если оно равно нулю. Когда вы запустите его, вам повезет, что сразу после вашего массива есть 0 слов, поэтому цикл останавливается.

0

Это чтение за массивом, и память там просто оказывается нулевой, просто удачей. Чтение за концом этого массива - неопределенное поведение, и результат может измениться в любое время, поэтому никогда не полагайтесь на него.

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;
}
  • 0
    Но a[i] сравнивается с 0!
  • 0
    @MattiVirkkunen Я думаю, вы могли бы сказать и это, но я думаю, что обычно происходит то, что здесь используется инструкция TEST для сравнения регистра с самим собой. stackoverflow.com/questions/6002079/...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню