Операции отрицания и дополнения
Операция арифметического отрицания (-) вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования.
Пример:
double u = 5;
u = -u; /* переменной u присваивается ее отрицание,
т.е. u принимает значение -5 */
Операция логического отрицания "НЕ" (!) вырабатывает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (0). Результат имеет тип int. Операнд должен быть целого или плавающего типа или типа указатель.
Пример:
int t, z=0;
t=!z;
Переменная t получит значение равное 1, так как переменная z имела значение равное 0 (ложно).
Операция двоичного дополнения (~) вырабатывает двоичное дополнение своего операнда. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования.
Пример:
char b = '9';
unsigned char f;
b = ~f;
Шестнадцатеричное значение символа '9' равно 39. В результате операции ~f будет получено шестнадцатеричное значение С6, что соответствует символу 'ц'.
Операция sizeof
С помощью операции sizeof можно определить размер памяти, который соответствует идентификатору или типу. Операция sizeof имеет следующий формат:
sizeof(выражение)
В качестве выражения может быть использован любой идентификатор, либо имя типа, заключенное в скобки. Отметим, что не может быть использовано имя типа void, а идентификатор не может относится к полю битов или быть именем функции.
Если в качестве выражения указанно имя массива, то результатом является размер всего массива (т.е. произведение числа элементов на длину типа), а не размер указателя, соответствующего идентификатору массива.
Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
Пример:
struct { char h;
short b;
double f;
} str;
int a1;
a1 = sizeof(str);
Переменная а1 получит значение, равное 16, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.
Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 3 байта для выравнивания адреса переменной b на границу слова (слово имеет длину 4 байта для 32-разрядной ОС), далее осуществляется выравнивание адреса переменной f на границу слова, таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 9 байт больше.
Дата добавления: 2016-07-27; просмотров: 1812;