int arrSize = 10;
double* arr = new double [arrSize];
for(int i = 0; i < arrSize; i++){
arr[i] = i;
}
for(int i = 0; i < arrSize; i++){
printf("%d", arr[i]);
//std::cout<<arr[i];
}
Вот
printf()
печатает 0000000000.cout
печатает 0123456789.Зачем ?
Использование неправильного спецификатора формата для любого конкретного аргумента в printf()
Запускает неопределенное поведение.
arr
это double
массив, следовательно arr[i]
производит double
введите значение. тебе нужно %f
спецификатор формата, чтобы напечатать это. Если вы используете %d
напечатать double
, ваша программа сталкивается с UB, и результат не может быть обоснован, в может быть что-нибудь.
ОТОХ, <<
используется с cout
перегруженный оператор, который может адаптироваться основанный на типе предоставленной переменной. Таким образом, он печатает вывод, как ожидалось.
arr[i]
это double
, но %d
это спецификатор формата для int
, Неправильное поведение — использовать неправильный спецификатор формата. Из стандарта C11, 7.21.6.1/9:
Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент
неправильный тип для соответствующей спецификации преобразования, поведение
не определено.
Есть много спецификаторов формата для double
это будет форматировать вывод по-разному, см. эта ссылка для полного списка.
С другой стороны, operator<<
за cout
имеет перегрузку, которая занимает double
непосредственно (# 5 в связанной ссылке), так что это просто работает.