2013-07-10 4 views
1

я придумал с кодомЧто это «#» делает здесь

#include <stdio.h> 

int main() 
{ 
    int i = 1427; 
    double d = 1427.0; 

    printf("%#o\n", i); 
    printf("%#X\n", i); 
    printf("\n%g\n", d); 
    printf("%#g\n", d); 
    return 0; 
} 

который дает выход:

02623 
0X593 

1427 
1427.00 

Сначала я думал, что # используется для префиксов 0 к выходу, но Я ошибался из-за его странного поведения в последнем выпуске, в котором он печатает нули после десятичного числа.
Может кто-нибудь объяснить, что это такое # и что он здесь делает?

+7

Да, у [документации] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html) 'printf()' есть отличное объяснение. –

+3

** Замечание модератора: ** Комментарии предназначены для выяснения вопросов, а не для обсуждения метаконференций. Для этого есть сайт, или используйте чат. http://meta.stackexchange.com/questions/19756/how-do-comments-work –

ответ

8

Флаг # имеет другое поведение, в зависимости от контекста.

Если он используется с o, x или X спецификаторов, значение предшествует 0, 0x или 0X соответственно.

Если он используется с a/A, e/E, f/F или G, значение всегда заканчивается с десятичной точкой.

Такое поведение довольно хорошо документировано в нескольких местах в Интернете. Поиск «printf» и, возможно, «спецификаторов формата», как правило, приводит к появлению множества хороших ссылок. Вот некоторые из них, чтобы подогреть аппетит:

+0

@Cody Grey; Спасибо приятель. Вы предоставили действительно хорошие ссылки (особенно [this] (http://msdn.microsoft.com/en-us/library/8aky45ct.aspx), которые очень помогли). Я даже не знал, что это флаг !!! – haccks

1

От человека страниц POSIX man 3p printf:

#: Указывает, что значение должно быть преобразовано в альтернативной форме. Для преобразования o увеличивает точность (если необходимо), чтобы заставить получить первую цифру результата, равную нулю. Для спецификаторов преобразования x или X ненулевой результат должен иметь префикс 0x (или 0X). Для аргументов преобразования a, A, e, E, f, F, g и G результат всегда должен содержать символ радикса, даже если никакие цифры не следуют за основанием charac- ter. Без этого флага в результате этих преобразований появляется символ радиуса, только если после него следует цифра. Для g и G преобразования спецификаторы, конечные нули не должны удаляться из результата, как обычно. Для других спецификаторов преобразования поведение не определено.

Проще говоря: он печатает альтернативный формат, независимо от того, что он есть. Для hex. значения, он префикс 0x, для восьмеричного 0 и для плавающих точек он заставляет некоторые десятичные правила ...

1

Я думаю, что если вы читаете о функции PRINTF языка C here, вы будете способных далее понимать такие вещи, как «#», среди прочих.

Используется с О, х или Х спецификаторам значение предваряется с 0, 0x или 0X соответственно для значений, отличных от нуля. Используемый с a, A, e, E, f, F, g или G заставляет записываемый вывод содержать десятичную точку даже , если больше цифр не указано. По умолчанию, если цифры не указаны, не указывается десятичная цифра .

1

отрывок из wikipedia:

# Альтернативные формы. Для 'g' и 'G' конечные нули не удаляются. Для 'f', 'F', 'e', ​​'E', 'g', 'G' выход всегда содержит десятичную точку. Для 'o', 'x' и 'X', 0, 0x и 0X, соответственно, добавляются к ненулевым числам.

0

% # o (Octal) 0 добавлен префикс.

% # x (Hex) Префикс 0x добавлен к ненулевым значениям.

% # X (Hex) Префикс 0X добавлен к ненулевым значениям.

% # g Всегда показывать конечную десятичную точку нули не удаляются.

Нулевые числа неизбежны после десятичного числа, потому что вы используете% # g.

Смежные вопросы