|
Программирование >> Инициализация объектов класса, структура
#include <iostream> int main()
Например, программа выводит на терминал следующее: i: 1024 &i: 0x7fff0b4 *pi: 1024 pi: 0x7fff0b4 &pi: 0x7fff0b0 Позже мы покажем, как напечатать адреса в десятичном виде. Следующая программа ведет себя странно. Mi хотим напечатать адрес, хранящийся в #include <iostream> const char *str = vermeer ; int main() { const char *pstr = str; cout << Адрес pstr равен: << pstr << endl; переменной pstr: Но после компиляции и запуска программа неожиданно выдает такую строку: i Адрес pstr равен: vermeer Проблема в том, что тин const char* интерпретируется как C-строка. Чтобы все же напечатать адрес, хранящийся в pstr, необходимо подавить обработку типа const служит левый операнд оператора вывода, т.е. сам объект cout. Затем этот же объект передается следующему оператору и далее но цепочке (mi говорим, что оператор << левоассоциативен). Имеется также предопределенный оператор вывода для указательных типов, который печатает адрес объекта. По умолчанию адреса отображаются в шестнадцатеричном виде. #include <iostream> inline void max out( int val1, int val2 ) { cout << ( val1 > val2 ) ? val1 : val2; int main() { int ix = 10, jx = 20; cout << Большее из << ix << , << jx << равно ; max out( ix, jx ); cout << endl; А вот еще одна загадка. Нужно напечатать большее из двух чисел: Однако программа выдает неправильный результат: Большее из 10, 20 равно 0 Проблема в том, что оператор вывода имеет более высокий приоритет, чем оператор условного выражения, поэтому печатается результат сравнения val1 и val2. Иными словами, выражение cout << ( val1 > val2 ) ? val1 : val2; вычисляется как (cout << ( val1 > val2 )) ? val1 : val2; Поскольку val1 не больше val2, то результатом сравнения будет false, обозначаемый нулем. Чтобы изменить приоритет операций, весь оператор условного выражения следует заключить в скобки: cout << ( val1 > val2 ? val1 : val2 ); Теперь результат получается правильный: char* по умолчанию. Для этого мы сначала убираем спецификатор const, а затем приводим pstr к типу void*: << static cast<void*>(const cast<char*>(pstr)) Теперь программа выводит ожидаем1й результат: i Адрес pstr равен: 0x116e8 i Большее из 10, 20 равно 20 Такого рода ошибку было бы проще найти, если бы значения литералов true и false тина bool печатались как строки, а не как 1 и 0. Тогда mi увидели бы строку: Большее из 10, 20 равно false и все стало бы ясно. По умолчанию литерал false печатается как 0, а true - как 1. Это можно изменить, воспользовавшись манипулятором boolalpha() , что и сделано в int main() cout << печать значений типа bool по умолчанию: << true << << false << \пи в виде строк: << boolalpha() << true << << false << endl; следующей программе: Вот результат: печать значений типа bool по умолчанию: 1 0 и в виде строк: true false Для в1вода массива, а также вектора или отображения, необходимо обойти все элемента: #include <iostream> #include <vector> #include <string> string pooh pals[] = { Тигра , Пятачок , Иа-Иа , Крок int main() { vector<string> ppals( pooh pals, pooh pals+4 ); vector<string>::iterator iter = ppals.begin(); vector<string>::iterator iter end = ppals.end(); cout << Это друзья Пуха: ; for ( ; iter != iter end; iter++ ) cout << *iter << ; cout << endl; напечатать каждый из них:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |