Печать целого числа с кодом преобразования с плавающей запятой (% f)? - PullRequest
0 голосов
/ 15 июня 2019

Итак, я изучал программирование на c и купил книгу. В конце главы есть проблема:

написать программу, которая определяет пять целочисленных переменных и инициализирует их 1, 10, 100, 1000, 10000. Затем она печатает их на одной строке, разделенной пробелами, используя десятичный код преобразования (% d), и на строка вложенности с кодом преобразования с плавающей точкой (% f). Обратите внимание на различия между результатами. Как вы им объясняете?

Теперь мой вопрос: как использовать код преобразования с плавающей запятой для числа, определяемого как int?

Это то, что я написал до сих пор:

#include <stdio.h>

int main(void)
{
    int one = 1; 
    int ten = 10;
    int hundred = 100; 
    int thousand = 1000;
    int tenThous = 100000;

    printf("%d %d %d %d %d \n", one, ten, hundred, thousand, tenThous);
    printf("%f %f %f %f %f \n", one, ten, hundred, thousand, tenThous);

    return 0; 
}

В том, как они описывают проблему, я думаю, что я должен использовать переменные типа int, которые я определил. Было бы легко создать новый набор чисел и объявить их как числа с плавающей точкой, но я не думаю, что это именно то, что они просят.

Сообщение об ошибке, которое я получаю при компиляции:

numPrint.c:12:33: warning: format specifies type 'double' but the argument has
      type 'int' [-Wformat]
    printf("%f %f %f %f %f \n", one, ten, hundred, thousand, tenThous);
            ~~                  ^~~
            %d

и он проходит через все переменные int, говоря, что формат указывает на 'double', а используемая переменная - 'int'

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вы можете привести printf() аргументы к плавающим значениям так:

printf("%f %f %f %f %f \n", (float)one, (float)ten, (float)hundred, (float)thousand, (float)tenThous);
1 голос
/ 15 июня 2019

Есть ли способ сделать это?

Вы сделали . Сообщения являются предупреждениями; у них не будет прерванной компиляции.

Или, может быть, вы спрашиваете, можете ли вы сделать это, не вызывая предупреждений? Что вы можете. В сообщении указывается, с каким флагом предупреждения связана конкретная диагностика: -Wformat. Вы можете отключить эти предупреждения, передав -Wno-format в качестве параметра командной строки.

Но вы не должны.

В предупреждениях говорится о добросовестной проблеме в вашем коде. Как и объясняется, дескриптор %f ожидает, что соответствующий аргумент будет иметь тип double. В качестве альтернативы, float также будет работать, так как он автоматически преобразуется в double в этом конкретном контексте, но если аргумент имеет другой тип, то поведение не определено. Вы можете привести аргументы к типу double, но я не совсем понимаю, что текст просит вас сделать.

Что делать вместо этого? Сожги книгу и получи лучшую. В самом деле. В учебнике по Си нет никаких оснований предлагать делать то, что, по-видимому, предложил ваш. Даже если это просто плохо сформулировано, вам нужно задаться вопросом, что вас там ждут другие вонючки. Сжигание книги вместо ее возвращения или раздачи - общественная работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...