Блог пользователя Malinovsky239

Автор Malinovsky239, 11 лет назад, По-русски

Добрый вечер.

При решении этой несложной задачи неожиданно столкнулся с тем, что я, кажется, не понимаю, как устроена работа функции printf. А именно есть три решения: раз, два и три.

Отличия исключительно в 47-й строке.

Почему третье решение получает WA, тогда как у двух первых ОК?

Разве функция printf не должна приводить аргумент к типу, заданному форматной строкой? А если должна, то как от приведения целочисленного нуля к double возникают проблемы?

Заранее спасибо за ответы.

  • Проголосовать: нравится
  • +21
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Не должна. Ибо это более-менее невозможно.

printf("0");

FTW

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Хорошо, тогда что происходит конкретно в третьем случае, что из-за этого возникает ошибка?

    upd. Паша ниже уже пояснил, так что вопрос неактуален.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +24 Проголосовать: не нравится

      В printf передается строка и просто все аргументы друг за другом, printf читает формат, видит %.6lf, решает что ей передали double, берет sizeof(double) байт и выводит их.

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +33 Проголосовать: не нравится

Нет не должна. И непонятно как она может это делать, с учетом того, что по сути тип узнается в real-time.

На самом деле ей можно передавать все что угодно. А команда %.6lf говорит "возьми со стека 8 байт, распознай их как double и выведи с 6 знаками". А что там лежит никого не волнует.

P.S. g++ -Wformat тебя наверное спасет. Вроде он включается -Wextra.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    g++ -Wall хватает. У меня на MinGW GCC 4.7.2 выдаёт то, что нужно:

    warning: format '%lf' expects argument of type 'double', but argument 2 has type 'int' [-Wformat]
    
    • »
      »
      »
      11 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Мне казалось ноль в любом типе хранится одинаково в битовой записи. Разве я не прав?

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +16 Проголосовать: не нравится

        Для базовых типов прав. Но он занимает разное количество байтов. А после этого количества может лежать любой мусор.

»
11 лет назад, # |
  Проголосовать: нравится -10 Проголосовать: не нравится

А не знаете почему у меня pastebin.com не работает? Который раз пытаюсь зайти не получается