Программирование >>  Инициализация объектов класса, структура 

1 ... 339 340 341 [ 342 ] 343 344 345 ... 395


#include <iostream> int main()

int i = int *pi

1024;

= &i;

cout <<

<<

i: << i \t&i:\t <<

&i <<

\n ;

cout <<

<< <<

*pi:

\tpi:\t

\t\t&pi:\t

<< *pi

<< pi

<< &pi

<< endl << endl;

Например, программа

выводит на терминал следующее:

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; напечатать каждый из них:



1 ... 339 340 341 [ 342 ] 343 344 345 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика