массив std :: cout и printf

    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.

Зачем ?

0

Решение

Использование неправильного спецификатора формата для любого конкретного аргумента в printf() Запускает неопределенное поведение.

arr это double массив, следовательно arr[i] производит double введите значение. тебе нужно %f спецификатор формата, чтобы напечатать это. Если вы используете %d напечатать double, ваша программа сталкивается с UB, и результат не может быть обоснован, в может быть что-нибудь.

ОТОХ, << используется с cout перегруженный оператор, который может адаптироваться основанный на типе предоставленной переменной. Таким образом, он печатает вывод, как ожидалось.

5

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

arr[i] это double, но %d это спецификатор формата для int, Неправильное поведение — использовать неправильный спецификатор формата. Из стандарта C11, 7.21.6.1/9:

Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент
неправильный тип для соответствующей спецификации преобразования, поведение
не определено.

Есть много спецификаторов формата для double это будет форматировать вывод по-разному, см. эта ссылка для полного списка.

С другой стороны, operator<< за cout имеет перегрузку, которая занимает double непосредственно (# 5 в связанной ссылке), так что это просто работает.

3

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