проблема с функцией printf? - PullRequest
       12

проблема с функцией printf?

2 голосов
/ 29 августа 2011

я написал следующую программу

 #include <stdio.h>

 main()
 {
 int i = 2;
 float c = 4.5;
 printf("%d\n",c);
 printf("%f\n",i);
 return 0;
 }

хотя я знаю, что это неправильная практика, когда я запускаю программу, я получаю ответ как

0
4.500000

но когда я немного обменялся предложениями printf таким образом

#include <stdio.h>

main()
{
int i = 2;
float c = 4.5;
printf("%f\n",i);
printf("%d\n",c);
return 0;
}

вывод был

0.000000
0

Я не мог понять, что происходит, любой, пожалуйста, объясните мне.

Ответы [ 5 ]

7 голосов
/ 29 августа 2011

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

Число с плавающей запятой хранится всовершенно другой путь в памяти к целому числу - это не просто целое число с некоторыми десятичными точками

6 голосов
/ 29 августа 2011

Использование некорректных дескрипторов формата приводит к неопределенному поведению .
Неопределенное поведение означает, что поведение не может быть объяснено. Это может сработать, может не сработать или дать непредсказуемые результаты, это поведение может измениться в любом случае, это не может быть объяснено портативным убедительным способом для всех компиляторов.

2 голосов
/ 29 августа 2011

По сути, заполнитель формата - это инструкция для функции о том, как извлечь и интерпретировать следующий кусок памяти из списка аргументов переменной длины. Он ожидает, что формат будет именно таким, как вы говорите. Когда вы извлекаете память непреднамеренным образом, вы можете вызвать всевозможные проблемы и неопределенное поведение. Вот почему printf и тому подобное можно использовать.

2 голосов
/ 29 августа 2011

целое число и число с плавающей точкой имеют различное внутреннее представление, поэтому вы не должны путать printf %f с %d, чтобы избежать непредсказуемых результатов.Люди используют C, особенно потому, что C быстр, и он быстр только потому, что оставляет все под ответственностью программиста.Так что не ожидайте, что printf сделает какое-то волшебное преобразование под капотом, потому что это просто не будет.

0 голосов
/ 20 октября 2013

Обычно элементы управления форматом заменяют заполнитель в соответствии с указанным типом данных.

  • %d ожидает аргумент типа int
  • %f ожидает аргумент типа double

Итак, хороший способ сделать это

#include <stdio.h>

int main(){
   int i = 2;
   float c = 4.5;
   printf("%d\n",i);
   printf("%f\n",c);
   return 0;
}
...