Символьные строки и форматированный ввод-вывод 129
Листинг 4.5. Программа defines. с

Ниже показан пример вывода:
Некоторые пределы чисел для данной системы:
Наибольшее значение типа int: 2147483647
Наименьшее значение типа long long: -9223372036854775808
В данной системе один байт = 8 битов.
Наибольшее значение типа double: 1, 797693е + 308
Наименьшее нормализованное значение типа float: 1,175494е-38
Точность значений типа float = 6 знаков
Разница между 1.00 и минимальным значением float, которое больше 1.00 =
1.192093е-07
Препроцессор С является полезным и удобным инструментом, так что применяйте его везде, где это возможно. Далее в книге вы увидите и другие случаи его использования.
Исследование и эксплуатация
ФУНКЦИЙ printf() И scanf()
Функции printf() и scanf() позволяют организовать взаимодействие с программой и называются функциями ввода-вывода. В языке С доступны и другие функции ввода-вывода, но printf() и scanf() являются наиболее универсальными. Исторически сложилось так, что они, как и все остальные функции в библиотеке С, не были частью определения языка. Первоначально язык С оставлял реализацию средств ввода-вывода разработчикам компиляторов; это делало возможным лучшее соответствие функций ввода-вывода конкретным машинам. В интересах совместимости различные реализации поставлялись со своими версиями функций scanf() и printf(). Тем не менее, между реализациями встречались некоторые расхождения. В С90 и С99 описаны стандартные версии этих функций, и именно их мы будем придерживаться.
Хотя printf() является функцией вывода, a scanf() — функцией ввода, обе они работают очень похожим образом, используя управляющую строку и список аргументов. Давайте рассмотрим по очереди printf() и scanf().
130 Глава 4
ФУНКЦИЯ printf()
Инструкции, которые вы даете функции printf(), запрашивая у нее вывод пере менной, зависят от типа этой переменной. Например, ранее мы применяли форму записи %d при выводе целого числа и %с при выводе символа. Эти обозначения называются спецификаторами преобразования, поскольку они определяют, каким образом данные преобразуются в отображаемую форму. Мы приведем список спецификаторов преобразования, которые стандарт ANSI С предоставляет для функции printf(), и затем покажем, как использовать наиболее общие из них. В табл. 4.3 перечислены спецификаторы преобразования и показан вывод, к которому они приводят.
Таблица 4.3. Спецификаторы преобразования и результирующий вывод

Использование функции printf()
В листинге 4.6 представлена программа, в которой применяются некоторые спецификаторы преобразования.
Символьные строки и форматированный ввод-вывод 131
Листинг 4.6. Программа printout, с

Вывод программы выглядит вполне ожидаемо:
7 участников соревнований съели 12.750000 пирожков с вишнями.
Значение pi равно 3.141593.
До свидания! Ваше искусство слишком дорого обходится,
$15600
Формат использования функции printf() имеет вид:
printf(управляющая-строка, элемент1, элемент2, ...);
Здесь элемент 1, эмемент2 и т.д. — это элементы, которые нужно вывести. Ими могут быть переменные, константы или даже выражения, которые вычисляются до того, как значение будет выведено. Далее, управляющая-строка представляет собой символьную строку, описывающую способ вывода элементов. Как упоминалось в главе 3, управляющая строка должна содержать спецификатор преобразования для каждого выводимого элемента. Например, рассмотрим следующий оператор:
printf("%d участников соревнований съели %f пирожков с вишнями.\n", number, pies);
В этом операторе управляющая-строка — это фраза, заключенная в двойные кавычки. Она содержит два спецификатора преобразования, соответствующие number и pies — двум выводимым элементам. На рис. 4.6 показан другой пример применения оператора printf().

Рис. 4.6. Аргументы функции printf()
Вот еще одна строка из примера:
printf("Значение pi равно %f.\n", PI);
На этот раз список элементов состоит только из одного элемента — символической константы PI.
132 Глава 4
Читать дальше