Использование ‘\ n’ вместо endl влияет на вывод, почему?

Поэтому я создал неинициализированный массив в C ++ и попытался напечатать последний элемент, чтобы посмотреть, каким будет результат. Каждый элемент в неинициализированном массиве должен иметь значение 0 (верно?), Но вывод, который я получил, был чем-то другим. Вот как выглядела основная функция:

int main() {
int i[5];
cout << i[4] << '\n';
}

Запуск этих выходов 1606416656 (один и тот же номер каждый раз) с разрывом строки. Тем не менее, изменение '\n' в endl изменяет вывод на 0 с разрывом строки.

Это почему?

Кроме того, пытаясь напечатать i[3] вместо i[4] правильно выводит 0 даже с '\n', Зачем?

Я провел некоторое исследование и где-то читал, что '\n' не очищает буфер endl делает. Что на самом деле означает «промывка потока», и это влияет на результат?

1

Решение

Ваше предположение, что вновь созданный массив в стеке инициализируется нулем, не выполняется. Поэтому ваш вывод является случайным. Изменение программы меняет порядок расположения памяти, и поэтому вы видите разные результаты.

int main() {
int i[5];
for (int k = 0; k < 5; ++k)
i[k] = 0;
cout << i[4] << '\n';
}

должен давать вам всегда ожидаемый результат, независимо от использования ‘\ n’ или endl

1

Другие решения

Каждый элемент в неинициализированном массиве должен иметь значение 0 (верно?)

Нет, они имеют неопределенное значение. Использование значений дает неопределенное поведение, поэтому вы получаете непредсказуемый результат.

Что на самом деле означает «промывка потока», и это влияет на результат?

Когда вы записываете в поток, вывод сохраняется в буфере памяти и не обязательно сразу отправляется в конечный пункт назначения (консоль, или файл, или что-то еще); это может дать большое преимущество в производительности, но также может означать, что вы не видите конечного результата, когда захотите. Очистка потока отправляет записанные вами данные в конечный пункт назначения.

2

Ваш массив остается неинициализированным. Какое бы значение вы ни получили, это случайно. std :: endl помещает символ новой строки и очищает буфер выходного потока. В этом разница манипулятора std :: endl и печати только символа новой строки.

1
По вопросам рекламы [email protected]