{ return ( ia ib ) ? ia : ib; }
эквивалентен
int min(int ia, int ib) {
if (ia ib)
return ia;
else
return ib;
}
Приведенная ниже программа иллюстрирует использование условного оператора:
#include iostream
int main()
{
int i = 10, j = 20, k = 30;
cout "Большим из "
i " и " j " является "
( i j ? i : j ) end1;
cout "Значение " i
( i % 2 ? " нечетно." : " четно." )
endl;
/* условный оператор может быть вложенным,
* но глубокая вложенность трудна для восприятия.
* В данном примере max получает значение
* максимальной из трех величин
*/
int max = ( (i j)
? (( i k) ? i : k)
: ( j k ) ? j : k);
cout "Большим из "
i ", " j " и " k
" является " max endl;
}
Результатом работы программы будет:
Большим из 10 и 20 является 20
Значение 10 четно.
4.8. Оператор sizeof
Оператор sizeof возвращает размер в байтах объекта или типа данных. Синтаксис его таков:
sizeof ( type name );
sizeof ( object );
sizeof object;
Результат имеет специальный тип size_t, который определен как typedef в заголовочном файле cstddef. Вот пример использования обеих форм оператора sizeof:
#include cstddef
int ia[] = { 0, 1, 2 };
// sizeof возвращает размер всего массива
size_t array_size = sizeof ia;
// sizeof возвращает размер типа int
size_t element_size = array_size / sizeof( int );
Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них. Так, например, в системах, где int хранится в 4 байтах, значением array_size будет 12. Применение sizeof к указателю дает размер самого указателя, а не объекта, на который он указывает:
int *pi = new int[ 3 ];
size_t pointer_size = sizeof ( pi );
Здесь значением pointer_size будет память под указатель в байтах (4 в 32-битных системах), а не массива ia.
Вот пример программы, использующей оператор sizeof:
#include string
#include iostream
#include cstddef
int main() {
size_t ia;
ia = sizeof( ia ); // правильно
ia = sizeof ia; // правильно
// ia = sizeof int; // ошибка
ia = sizeof( int ); // правильно
int *pi = new int[ 12 ];
cout "pi: " sizeof( pi )
" *pi: " sizeof( pi )
endl;
// sizeof строки не зависит от
// ее реальной длины
string stl( "foobar" );
string st2( "a mighty oak" );
string *ps = stl;
cout " st1: " sizeof( st1 )
" st2: " sizeof( st2 )
" ps: sizeof( ps )
" *ps: " sizeof( *ps )
endl;
cout "short :\t" sizeof(short) endl;
cout "shorf" :\t" sizeof(short*) endl;
cout "short :\t" sizeof(short) endl;
cout "short[3] :\t" sizeof(short[3]) endl;
}
Результатом работы программы будет:
pi: 4 *pi: 4
st1: 12 st2: 12 ps: 4 *ps:12
short : 2
short* : 4
short : 2
short[3] : 6
Из данного примера видно, что применение sizeof к указателю позволяет узнать размер памяти, необходимой для хранения адреса. Если же аргументом sizeof является ссылка, мы получим размер связанного с ней объекта.
Гарантируется, что в любой реализации С++ размер типа char равен 1.
// char_size == 1
size_t char_size = sizeof( char );
Значение оператора sizeof вычисляется во время компиляции и считается константой. Оно может быть использовано везде, где требуется константное значение, в том числе в качестве размера встроенного массива. Например:
// правильно: константное выражение
int array[ sizeof( some_type_T )];
4.9. Операторы new и delete