Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л2.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
255.49 Кб
Скачать

5.8. Операция sizeof

С помощью операции sizeof можно определить размер памяти в байтах, которая соответствует идентификатору, типу данных или какому-то выражению. Операция sizeof имеет следующий формат:

sizeof(операнд)

В качестве операнда не может быть использовано имя типа void, а идентификатор не может относиться к полю битов или быть именем функции.

Семантически это выражение является беззнаковой константой и может быть использовано в любом месте, где требуется константа. В основном эта операция используется для определения пространства, необходимого для динамического создания объекта. Он используется вместе с операторами управления памятью new и delete, при использовании которых редко нужно знать размер представления типа.

Если в качестве операнда указан тип данных, то операция sizeof() выдает число байт, необходимое для представления типа.

Если в качестве операнда указано выражение, результатом будет размер типа выражения.

Например:

#include<stdio.h>

void main()

{

int a;

double b;

printf("%d",sizeof(a*b));

}

даст результат 8 байт такой, если бы было записано sizeof(double) , т.к. результат выражения a*b приводится к типу double.

Если в качестве операнда указано имя массива, то результатом является размер всего массива (т.е. произведение числа элементов на длину типа), а не размер указателя, соответствующего идентификатору массива.

Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.

Пример:

struct { char h;

int b;

double f;

} str;

int a1;

a1 = sizeof(str);

Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.

Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.

В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов, т.е. приведенную выше структуру следует записать в следующем виде:

struct { double f;

int b;

char h;

} str;

5.9. Условная операция

В языке С++ имеется одна тернарная операция - условная операция, которая имеет следующий формат:

Форма записи:

выражение1 ? выражение2 : выражение3

Результат Выражения1 должен быть целого или плавающего типа или быть указателем. Он оценивается с точки зрения его эквивалентности 0. Если результат Выражения1 не равен 0, то вычисляется Выражение2 и его значение является результатом операции. Если результат Выражения1 равен 0, то вычисляется Выражение3 и его значение является результатом операции. Следует отметить, что вычисляется либо Выражение2, либо Выражение3, но не оба. Тип результата зависит от типов 2 и 3, следующим образом.

1. Если результат Выражения2 или Выражения3 имеет целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип результата выражения после преобразования.

2. Если Выражение2 и Выражение3 имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.

3. Если оба выражения имеют тип void, то результат имеет тип void.

4. Если одно выражение является указателем на объект любого типа, а другое является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата.

5. Если одно выражение является указателем, а другое константным выражением со значением 0, то типом результата будет тип указателя.

Пример:

#include <stdio.h>

void main()

{

float a,b,c,max,m1;

printf("Введите а,b,с:\n");

scanf("%f %f %f",&a,&b,&c);

max=(a>b)?a:b;

max=(max>c)?max:c;

printf("%f\n",max);

}

Переменной max присваивается максимальное значение переменных a, b, c.

Пример: Расположить числа a,b,c в порядке убывания

#include <stdio.h>

void main()

{

float a,b,c,h;

printf("Введите a,b,c:\n");

scanf("%f %f %f",&a,&b,&c);

a<b?h=a,a=b,b=h:h=0;

a<c?h=a,a=c,c=h:h=0;

b<c?h=b,b=c,c=h:h=0;

printf("a= %.3f b= %.3f c= %.3f\n",a,b,c);

printf("\nПРОГРАММУ СОСТАВИЛ ИВАНОВ");

}

Самостоятельная проработка:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]