Глава 6. Базовые типы данных и операции__________________________747
const char* msg = "мир!";
printf("Здравствуй, %s", msg);
int birthday = 1974;
printf ("Вы родились в °od году\п", birthday);
то традиционные методы сопоставления переменных и аргументов не могут быть применены.
Замечание
Строка формата const char* может содержать литеры и параметры вроде %d (десятичный) и %s (строковый), помогающие функции разобраться в полученных аргументах.
Подробные сведения о параметрических типах аргументов ищите в главе 13 или в вашем справочном файле.
Точная информация о типах аргументов нужна компилятору для того, чтобы правильно извлекать переменные из стека (туда они помещаются при вызове функции). В случае списка аргументов переменной длины для этого имеется строка формата, задающая как количество, так и тип аргументов. Чтобы выяснить порядок, число и тип аргументов, лежащих в стеке, надо подсчитать и проанализировать параметрические аргументы — типа %d, %f или %s. И только потом аргументы можно извлекать из стека.
Эта возможность передачи списков аргументов не дается даром, процедура обработки строки формата делает printf и scanf достаточно медленными (изучение весьма замысловатых правил составления формата тоже не назовешь детской забавой). Очевидно, для ввода и вывода необходимо придумать что-то получше.
cin и couf
Класс iostream был создан еще при зарождении C++. Как ни удивительно, операция потокового вывода (ostream) « и операция потокового ввода (istream) » изначально были реализованы как надстройка над printf и scanf. Это может показаться странным, но справедливости ради следует сказать, что, как бы ни были неудобны эти функции, их работоспособность проверялась годами. Благодаря тому что особенности printf и scanf были загнаны внутрь классов, у пользователей отпала необходимость в понимании и применении только что упомянутых символов формата С.
Замечание
Для лучшего представления о том, как функции могут быть свернуты в классы и привязаны к операциям (как « и »), обратитесь к главам 14 "Базовые концепции классов", 15 "Перегрузка функций" и 16 "Перегрузка операций".