Поэтому я создал неинициализированный массив в C ++ и попытался напечатать последний элемент, чтобы посмотреть, каким будет результат. Каждый элемент в неинициализированном массиве должен иметь значение 0 (верно?), Но вывод, который я получил, был чем-то другим. Вот как выглядела основная функция:
int main() {
int i[5];
cout << i[4] << '\n';
}
Запуск этих выходов 1606416656
(один и тот же номер каждый раз) с разрывом строки. Тем не менее, изменение '\n'
в endl
изменяет вывод на 0
с разрывом строки.
Это почему?
Кроме того, пытаясь напечатать i[3]
вместо i[4]
правильно выводит 0
даже с '\n'
, Зачем?
Я провел некоторое исследование и где-то читал, что '\n'
не очищает буфер endl
делает. Что на самом деле означает «промывка потока», и это влияет на результат?
Ваше предположение, что вновь созданный массив в стеке инициализируется нулем, не выполняется. Поэтому ваш вывод является случайным. Изменение программы меняет порядок расположения памяти, и поэтому вы видите разные результаты.
int main() {
int i[5];
for (int k = 0; k < 5; ++k)
i[k] = 0;
cout << i[4] << '\n';
}
должен давать вам всегда ожидаемый результат, независимо от использования ‘\ n’ или endl
Каждый элемент в неинициализированном массиве должен иметь значение 0 (верно?)
Нет, они имеют неопределенное значение. Использование значений дает неопределенное поведение, поэтому вы получаете непредсказуемый результат.
Что на самом деле означает «промывка потока», и это влияет на результат?
Когда вы записываете в поток, вывод сохраняется в буфере памяти и не обязательно сразу отправляется в конечный пункт назначения (консоль, или файл, или что-то еще); это может дать большое преимущество в производительности, но также может означать, что вы не видите конечного результата, когда захотите. Очистка потока отправляет записанные вами данные в конечный пункт назначения.
Ваш массив остается неинициализированным. Какое бы значение вы ни получили, это случайно. std :: endl помещает символ новой строки и очищает буфер выходного потока. В этом разница манипулятора std :: endl и печати только символа новой строки.