Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Примитивные типы данных в Си.

Поиск

В языке Си предусмотрено несколько основных типов объектов:

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

Целый. Можно использовать до трех размеров целых, описываемых как short int, int и long int.

Беззнаковый. Целые без знака, описываемые как unsigned, подчиняются законам арифметики по модулю 2**n, где n - число битов в их представлении.

Вещественный. Вещественные одинарной точности (float) и вещественные двойной точности (double) в некоторых реализациях могут быть синонимами.

В языке нет логического типа данных, а в качестве логических значений используются целые "0" - "ложь" и "1" - "истина" (при проверках любое целое, не равное 0, трактуется как "истина").

Поскольку объекты упомянутых выше типов могут быть разумно интерпретированы как числа, эти типы будут называться арифметическими. Типы char и int всех размеров совместно будут называться целочисленными. Типы float и double совместно будут называться вещественными типами.

 

 

Массивы данных в Си.

Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Объявление массива имеет два формата:

- спецификатор-типа описатель [константное-выражение];

- спецификатор-типа описатель [ ];

Описатель - это идентификатор массива.

Спецификатор-типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

Константное-выражение в квадратных скобках задает количество элементов массива. Константное-выражение при объявлении массива может быть опущено в следующих случаях:

- при объявлении массив инициализируется,

- массив объявлен как формальный параметр функции,

- массив объявлен как ссылка на массив, явно определенный в другом файле.

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

Каждое константное-выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два константных-выражения, трехмерного - три и т.д. Отметим, что в языке СИ первый элемент массива имеет индекс равный 0.

Примеры: int a[2][3]; /* представлено в виде матрицы

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] */ double b[10]; /* вектор из 10 элементов имеющих тип double */ int w[3][3] = { { 2, 3, 4 }, { 3, 4, 8 }, { 1, 0, 9 } }; В последнем примере объявлен массив w[3][3]. Списки, выделенные в фигур­ные скобки, соответствуют строкам массива, в случае отсутствия скобок ини­циализация будет выполнена неправильно. В языке СИ можно использовать сечения массива. Сечения формируются вследствие опускания одной или нескольких пар квад­ратных скобок. Пары квад­ратных скобок можно отбрасывать только справа на­лево и строго последова­тельно. Примеры: int s[2][3]; Если при обращении к некоторой функции написать s[0], то будет переда­ваться нулевая строка массива s. int b[2][3][4]; При обращении к массиву b можно написать, например, b[1][2] и будет пере­даваться вектор из четырех элементов, а обращение b[1] даст двухмерный мас­сив размером 3 на 4. Объявление символьного массива: char str[] = "объявление символьного мас­сива"; 11 Структуры данных в Си. Структуры - составной объект, в который вхо­дят элементы любых типов, за исключением функций. В отличие от массива, ко­торый является однородным объектом, структура может быть неоднородной.

Тип структуры определяется записью вида: struct {список определений}

В структуре обязательно должен быть указан хотя бы один компонент. Определение структур имеет следующий вид: тип-данных описатель; где тип-данных указывает тип структуры для объектов, определяемых в описателях. В простейшей форме описатели представляют собой идентификаторы или мас­сивы. Пример: struct { double x,y; } s1, s2, sm[9]; struct { int year; char moth, day; } date1, date2; Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти струк­тур. Каждая из двух переменных date1, date2 состоит из трех компонентов year, moth, day.Существует и другой способ ассоциирования имени с типом структуры, он ос­нован на использовании тега структуры. Тег структуры аналогичен тегу пере­числимого типа. Тег структуры определяется следующим образом: struct тег { список описаний; }; где тег является идентификатором. В приведенном ниже примере идентификатор student описывается как тег структуры: struct student { char name[25]; int id, age; char prp;}; Тег структуры используется для последующего объявления структур данного вида в форме: struct тег список-идентификаторов.Пример: struct studeut st1,st2; Использование тегов структуры необходимо для описания рекурсивных струк­тур. Ниже рассматривается использование рекурсивных тегов структуры. struct node { int data; struct node * next; } st1_node; Тег структуры node действительно является рекурсивным, так как он исполь­зуется в своем собственном описании, т.е. в формализации указателя next. Структуры не могут быть прямо рекурсивными, т.е. структура node не может со­держать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приве­денном примере. Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например: st1.name="Иванов"; st2.id=st1.id; st1_node.data=st1.age;

Операции и выражения в СИ

Унарные операции

* (косвенная адресация): выражение должно быть указателем, а рез-том явл-ся l_значение (lvalue), ссылающееся на тот объект, на кот.

указ-ет выражение.

& (взятие адреса):рез-т - указатель на объект, на кот. ссылается l_значение.

- (минус): рез-т - ее операнд, взятый с противоположным знаком. Для unsigned рез-т получ-ся вычитанием ее знач-я из 2**n, где n-число битов в int.

Унарной операции + (плюс) не существует.

! (логическое отрицание): результат - 1, если знач-е ее операнда равно 0, и 0, если знач-е ее операнда отлично от нуля. Результат имеет тип int. Эта операция применима к любому арифметическому типу или указателям.

~ (дополнение до единицы) – дает обратный код своего операнда. Вып-ся обычн. арифм. преобразования. Операнд должен быть целочисленного типа.

++(инкремент). Объект, на который ссылается операнд l_значения операции ++, увеличивается. Выражение ++х эквивалентно х += 1.

-- (декремент) - аналогична префиксной операции ++, но приводит к уменьшению своего операнда l_значения.

() (cast) - Заключенное в круглые скобки имя типа данных, стоящее перед выражением, вызывает преобраз-е знач-я эт. выражения к указанному типу.

sizeof выдает размер своего операнда в байтах. Может быть примен. и к заключенному в круглые скобки имени типа. Тогда она выдает размер в байтах объекта указанного типа.

Мультипликативные операции *, /, и % группируются слева направо.

% выдает остаток от дел-я перв. выраж-я на второе. Операнды должны быть целого типа.

Аддитивные операции + и - группируются слева направо.

Операции сдвига << и >> группируются слева направо. Операнды целого типа. Правый операнд преобразуется к типу int; результат имеет тип левого операнда. Результат не определен, если правый операнд отрицателен или больше или равен, чем длина объекта в битах.

Операции отношения < (меньше), > (больше), <= (меньше или равно) и >=

(больше или равно) дают 0, если указанное отношение ложно, и 1, если оно истинно. Результат имеет тип int.

Операции равенства == (равно) и!= (не равно)

Операция присваивания

выражение_присваивания:

l_значение = выражение l_значение (op)= выражение

op: -, *, /, %, >>, <<, &, ^, |

 



Поделиться:


Последнее изменение этой страницы: 2016-06-26; просмотров: 622; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.130.230 (0.006 с.)