Добрый вечер.
При решении этой несложной задачи неожиданно столкнулся с тем, что я, кажется, не понимаю, как устроена работа функции printf. А именно есть три решения: раз, два и три.
Отличия исключительно в 47-й строке.
Почему третье решение получает WA, тогда как у двух первых ОК?
Разве функция printf не должна приводить аргумент к типу, заданному форматной строкой? А если должна, то как от приведения целочисленного нуля к double возникают проблемы?
Заранее спасибо за ответы.
Не должна. Ибо это более-менее невозможно.
FTW
Хорошо, тогда что происходит конкретно в третьем случае, что из-за этого возникает ошибка?
upd. Паша ниже уже пояснил, так что вопрос неактуален.
В
printf
передается строка и просто все аргументы друг за другом,printf
читает формат, видит%.6lf
, решает что ей передалиdouble
, беретsizeof(double)
байт и выводит их.Нет не должна. И непонятно как она может это делать, с учетом того, что по сути тип узнается в real-time.
На самом деле ей можно передавать все что угодно. А команда %.6lf говорит "возьми со стека 8 байт, распознай их как double и выведи с 6 знаками". А что там лежит никого не волнует.
P.S.
g++ -Wformat
тебя наверное спасет. Вроде он включается-Wextra
.g++ -Wall
хватает. У меня на MinGW GCC 4.7.2 выдаёт то, что нужно:Мне казалось ноль в любом типе хранится одинаково в битовой записи. Разве я не прав?
Для базовых типов прав. Но он занимает разное количество байтов. А после этого количества может лежать любой мусор.
А не знаете почему у меня pastebin.com не работает? Который раз пытаюсь зайти не получается