@Phage7
Уметь задать вопрос значит знать половину ответа.

Для чего нужны спецификаторы в C?

printf("%f\n", 1.0 / 10.0). Для чего в этой функции нужен вот этот спецификатор %f? В чем разница спецификаторов?
%ld %f %0.f Зачем эти спецификаторы нужны?

Прошу объяснять как чайнику, поскольку я таковым и являюсь.
  • Вопрос задан
  • 580 просмотров
Пригласить эксперта
Ответы на вопрос 3
@alexalexes
Чтобы дать функции printf дополнительную информацию, в каком виде вы хотите вывести результат второго и последующих аргументов этой функции. Спецификаторы имеют определенное отношение к такому понятию, как тип данных. В выводе типа вещественного числа можно настроить знаковую точность, поэтому есть не только %f, но и %0.f и т.д.
https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D...
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Описывает формат поля вывода, то есть в каком виде printf() должен напечатать аргумент. Спецификаторы могут быть довольно развесистыми - тут и выравнивание по границе (левая-правая), и символы заполнители и точность вывода...

man printf(), все тут не перечислишь. Да и не так уж часто они и используются, но тем не менее знать про их наличие надо.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Связано это в первую очередь с механизмом передачи переменных аргументов в функцию Си.
Они просто сваливаются в стеке один за другим — и нужно каким-то образом показать, сколько этих аргументов и каких типов. И уж во вторую очередь — формат вывода: точность, система счисления, заглавные буквы, ширина и прочее.

Именно по этой причине — спецификаторы printf в первую очередь задают типы аргументов — функция printf ничего не может сделать, если мы ошиблись с типом. Потому что %d (%ld, %lld) для неё в первую очередь способ понять, сколько байтов взять со стека и как их интерпретировать.

Си++ для этих целей использует перегрузку функций, Delphi — тэгированные данные, Java — объектный полиморфизм. Так что они знают, с каким типом данных имеют дело — и для них не нужно различать signed/unsigned int/long/long long. Для них %d/%x/%X означает разные варианты целого, %e/f/g — разные варианты дробного, и. т.д. Если для дробного пользователь напишет %d, они или выкинут ошибку, или как-то интерпретируют.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы