Скалярные типы данных, операции, преобразование типов.
В С можно использовать различные типы данных для представления хранимой и обрабатываемой информации.
- Типы данных и элементы памяти.
Тип задается набором допустимых значений и набором действий, которые можно совершать над каждой переменной рассматриваемого типа. Переменные типизируются посредством их описаний.
Выражения типизируются посредством содержащих в них операций.
В С имеется множество предопределенных типов данных, включая несколько видов целых, вещественных, указателей, переменных, массивов, функций, объединений, структур и тип void (отсутствие типа).
Скалярные типы: указатель, арифметический (целый, вещественный), перечисляемый.
Тип void.
Функции.
Агрегатные типы: массив, структура, объединение.
В следующей таблице представлены типы С, их размеры и диапазоны
Тип | Размер в байтах | Диапазон значений |
char, signed char | -128…127 | |
unsigned char | 0…255 | |
int, signed int, short int, signed short int | -32768…32767 | |
unsigned int, unsigned short int | 0…65535 | |
long int, signed long int | -2147483648…2147483647 | |
unsigned long int | 0…4294967295 | |
float | 3.4E-38…3.4E38 | |
double | 1.7E-308…1.7E308 | |
long double | 3.4E-4932…3.4E4932 | |
pointer | ||
pointer |
Переменные целого типа
Переменная описываются с помощью спецификатора типа (см. таблицу) и при описании ей может быть присвоено начальное значение.
Пример
int age=20, height=170; // возраст, рост
unsigned weight=height/2; // вес
long index; // индекс
Замечание Если используются спецификаторы unsigned, short, long, то int можно опускать.
Допустимые операции над целочисленными операндами указаны в таблице
Арифметические операции | |
Обозначение | Операция |
+ | Унарный плюс, сложение |
- | Унарный минус, вычитание |
* | Умножение |
/ | Деление |
% | Остаток от деления |
x= | Изменить и заменить, где х={+,-,*,/,%} |
++ | Инкремент (увеличение на 1) |
-- | Декремент (уменьшение на 1) |
Логические операции | |
Обозначение | Операция |
&& | И (логическое умножение) |
|| | ИЛИ (логическое сложение) |
! | НЕ (отрицание) |
= = | Равно |
! = | Не равно |
> | Больше |
< | Меньше |
>= | Больше или равно |
<= | Меньше или равно |
Битовые операции | |
Обозначение | Операция |
& | И (and) |
| | ИЛИ (or) |
^ | ИСЛЮЧАЮЩЕЕ ИЛИ |
~ | Отрицание |
>> | Сдвиг вправо |
<< | Сдвиг влево |
x= | Изменить и заменить, где x={&,|,^,>>,<<) |
Переменные вещественного типа
Для описания таких переменных используются спецификаторы float, double, long double.
Пример
float force=12.78, /* сила */
acceleration=1.234; /* ускорение */
double height; /* высота */
Операции над вещественными операндами, аналогичны арифметическим и логическим операциям над целочисленными операндами (см. предыдущую таблицу). Исключение – операция % (остаток от деления).
Символьные переменные
Для описания символьных переменных используются спецификаторы char, signed char, unsigned char.Можно задавать начальные значения. Пример
char ch=’$’, ans=’n’, ascii_value=65;
Замечание В выражениях переменные типа char могут смешиваться с переменными типа int, поскольку те и другие принадлежат к целому типу. Пример
#include <stdio.h>
Main()
{
char ch=’a’, ans;
printf(“значение ch+3=%c”,ch+3);
ans=ch%3;
printf((“\n\n значение ans=%d\n”,ans);
}
Программа выводит на экран следующие строки:
Значение ch+3=d
Значение ans=1
Строковые переменные
Для определения строковой переменной необходимо использовать тип char и указать максимальное число символов, которое может содержать строка. В С нет стандартного типа строкаи строка объявляется, как массив символов, но для работы с массивом символов, как со строкой имеется набор библиотечных функций.
Описание в общем случае:
char name[n];
name – имя массива;
n– размер массива.
Пример
char str[80];
Работу со строковыми данными рассмотрим подробнее при изучении массивов и функций работы со строками.
- Приоритет и порядок выполнения операций.
Если в выражении не используются круглые скобки, задающие порядок выполнения операций, то группировка операндов для операций производится с учетом приоритета операций. В следующей таблице приведены операции в порядке убывания приоритета.
Операция | Назначение |
[ ] | Задание элемента массива |
( ) | Вызов функции |
. | Выбор поля структуры |
-> | Выделение поля структуры с помощью указателя |
++, -- | Постфиксное/префиксное увеличение на 1 (постфиксное более приор.) |
sizeof | Определение размера переменной в байтах |
(тип) | Приведение к типу |
~ | Побитовое отрицание |
! | Логическое НЕ |
- | Унарный минус |
& | Определение адреса |
* | Обращение по адресу |
*,/,% | Умножение, деление, остаток |
+,- | Сложение, вычитание |
<<,>> | Сдвиг влево, сдвиг вправо |
<,>,<=,>= | Сравнение |
= =, != | Равенство, неравенство |
& | Побитовое И |
^ | Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ |
| | Побитовое ИЛИ |
&& | Логическое И |
|| | Логическое ИЛИ |
?: | Условный оператор |
=,+=,=,*=,/=,%=,&= &=,^=,|=,<<=,>>= | Присваивание и замещение |
, | Операция запятая, которая предписывает последовательное вычисление выражений |
Операции отношения
Логические выражения строятся из операций отношения и вырабатывают в качестве результата значение типа int. Если результат равен 0, то считается, что логическое выражение ложно, в противном случае – истинно. Если в логическом выражении не используются скобки, то оно вычисляется слева направо. Вычисление прекращается, как только результат становится определенным. Такой способ вычисления логических выражений называется усечением. Например
if (a>b||c>d||e>f)
Вычисление выражения прерывается, как только выясняется, что, либо a>b, либо c>d, либо e>f.
Усечение с успехом может быть использовано для задания корректного порядка вычислений в логических выражениях.
Например, логическое выражение
if (b!=0.0&&a/b>12.4)
Имеет больший смысл, чем логическое выражение
if (a/b>12.4&&b!=0.0)
Побитовые операции
Операнд или операнды побитовых операций должны быть целого типа. Побитовые операции обычно используются в приложениях, где требуется манипуляция с битами на нижнем уровне.
Операции &,|,^ определяются следующим образом
И | ||
ИЛИ | ||
ИСК. ИЛИ | ||
Операции << и >>служат для сдвига последовательности битов, соответственно, влево и вправо.
Эти операции можно применять для деления или умножения на число, равное степени 2, в соответствии со следующими правилами:
x>>n – эквивалентно делению х на
x<<n– эквивалентно умножению хна
Пример
123=0000000001111011
123<<5 -> 0000111101100000=3936
123>>1 -> 00000000000111101=61
Операции присваивания
К этим операциям относятся: = , += , -= , *= , /= , %= , и префиксные и постфиксные операции ++ и --.
Все операции присваивают переменной результат вычисления выражения. Если тип левой части при присваивании отличается от типа правой части, то тип правой части приводится к типу левой. В одном операторе операция присваивания может встречаться несколько раз. Вычисление производится справа налево. Например
a=(b=c)*d;
Значению переменной b присваивается значение переменной c, затем выполняется операция умножения на dи результат присваивается переменной a.
Типичный пример использования многократного присваивания
a=b=c=d=e=f=0;
Операции += , -= , *= , /= являются укороченной формой записи операции присваивания, а именно:
a+=b; -> a=a+b; a-=b; -> a=a-b; a*=b; -> a=a*b; a/=b; -> a=a/b;
Постфиксные и префиксные операции ++ и -- используются для увеличения (инкремент) и уменьшения (декремент) на 1 значения переменной. Семантика указанных операций следующая:
++a ,а++– увеличение значения переменной a на 1 до (после) ее использования в выражении.
--a ,а-- – уменьшение значения переменной a на 1 до (после) ее использования в выражении.
Пример
#include <stdio.h>
Main()
{
int a,b,c=3,d=4,f=3,g,h=5,z=6,i;
a=z+(b=c*d*f+(g=h+(i=3)));
printf(“%d\n”,a);
}
Программа выводит на экран значение – 50.
Операция sizeof
Эту операцию можно применять к константе, типу или переменной. В результате будет получено число байтов, занимаемых операндом. Если операндом является тип, то такой операнд следует заключать в круглые скобки. Если операнд переменная, то скобки можно опускать.
Пример
#include <stdio.h>
Main()
{
Float a;
Int b;
Char c;
float d[500];
printf(“\n Размер памяти под целое %d”, sizeof(int));
printf(“\n Размер памяти под двойную точность %d”, sizeof(double));
printf(“\n Размер памяти под переменную a %d”, sizeof a);
printf(“\n Размер памяти под массив d %d”, sizeof d);
}
Результат работы программы
Размер памяти под целое 2