Я получаю предыдущее значение с плавающей точкой при печати нового значения - PullRequest
1 голос
/ 14 марта 2019

Я получаю вывод 0.23 со второго printf. Но приведение типов дает требуемый результат. Если я не использую приведение типа, печатается предыдущее значение. Версия компилятора GCC 6.3

#include <stdio.h>

int main() {
    printf("%f ", 0.23);
    printf("%f", 0);
    return 0;
}

ССЫЛКА НА IDE

Ответы [ 2 ]

6 голосов
/ 14 марта 2019

in

> printf("%f",0);

Вы просите напечатать double , но вы даете int , это противоречиво

Вы не вслучай, когда сгенерированный код делает double из int , потому что printf не int printf(const char *, double);, а int printf ( const char * format, ... );, и компилятор не смотрит на форматсделать необходимые преобразования (но во многих случаях компилятор предупреждает вас)

Когда печатает , доступ ко второму аргументу позволяет получить double с использованием 64bи, вероятно, ваш int использует только 32b, поведение не определено.


(редактируйте, спасибо @chqrlie)

Я получаю предыдущее значение с плавающей запятойкогда я печатаю новое значение

В вашем случае может быть printf извлекает двойное значение из регистров MMX в отличие от значения int , которое было переданочерез стек или обычные регистры ... которые могут объяснить, почему одно и то же значение печатается дважды.Но, конечно, как всегда с неопределенным поведением, в любое время может произойти все что угодно

3 голосов
/ 14 марта 2019

Проблема состоит в сочетании двух факторов:

Во-первых, для функций vararg, таких как printf, компилятор не будет выполнять никаких неявных преобразований аргументов. Таким образом, 0 в списке аргументов является константой integer (типа int).

Второй фактор - это несоответствующий спецификатор формата. Функция printf не знает ничего о передаваемых аргументах, кроме того, что указано в строке формата. Несоответствие формата и типа аргумента приводит к неопределенному поведению . И поскольку спецификатор "%f" заставляет printf ожидать значение типа double, а вы дали значение int, у вас есть такое несоответствие.

...