Типы данных в Си - класс данных, значения которых имеют схожие характеристики. Тип определяет внутреннее представление данных в памяти. Самые основные типы данных: логический, целочисленный, числа с плавающей точкой, строковые, указатели.
Типизация
При динамической типизации переменная связывается с типом на момент инициализации. Получается, что переменная в разных участках кода может иметь разные типы. Динамическую типизацию поддерживают Java Script, Python, Ruby, PHP.
Статическая типизация является противоположностью динамической. При объявлении переменная получает тип, который не меняется в дальнейшем. Языки Си и Си++ являются именно такими. Этот способ наиболее удобный для написания сложного кода, а на стадии компиляции исключается много ошибок.
Языки неформально делятся на сильнотипизированный и слаботипизированный. Сильная типизация подразумевает, что компилятор выдаст ошибку при несовпадении ожидаемого и фактического типов.
x = 1 + “2”; //ошибка - нельзя прибавить к числу символьный знак
Пример слабой типизации.
x = 1 + “2”; // 3
Проверка согласования типов осуществляется системой типобезопасности. Ошибка типизации возникает, например, при попытке использовать число как функцию. Существуют нетипизированные языки. В противоположность типизированным, они позволяют осуществлять любые операции над каждым объектом.
Классы памяти
Переменные, независимо от их типа, имеют свою область видимости и время существования.
Классы памяти:
- auto;
- static;
- extern;
- register.
Все переменные в языке Си по умолчанию являются локальными. Они могут использоваться только внутри функции или блока. По завершении функции их значение уничтожается.
Статическая переменная также является локальной, но вне своего блока может иметь другое значение, а между вызовами функции значение сохраняется.
Внешняя переменная является глобальной. Она доступна в любой части кода и даже в другом файле.
Регистровая переменная рекомендует компилятору сохранять значение в оперативную память.
Спецификаторы типов данных в Си могут не указываться в таких случаях:
- Все переменные внутри блока не являются переменными, соответственно, если предполагается использование именно этого класса памяти, то спецификатор auto не указывается.
- Все функции, объявленные вне блока или функции, являются по умолчанию глобальными, поэтому спецификатор extern не обязателен.
Базовые типы
Для указания простых типов указываются спецификаторы int, char, float или double. К переменным могут подставляться модификаторы unsigned (беззнаковый), signed (знаковый), short, long, long long.
По умолчанию все числа являются знаковыми, соответственно, могут находиться в диапазоне только положительных чисел. Чтобы определить переменную типа char как знаковую, пишется signed char. Long, long long и short указывают, как много места в памяти отводится для хранения. Наибольшее - long long, наименьшее - short.
Char - самый маленький тип данных в Си. Для хранения значений выделяется всего 1 байт памяти. Переменной типа character обычно присваиваются символы, реже - цифры. Символьные значения берутся в кавычки.
char a = “a”;char b = 2;
Тип int хранит целые числа, его размер не определен - занимает до 4 байт памяти, в зависимости от архитектуры компьютера.
int a = 12;
Явное преобразование беззнаковой переменной задается так:
unsigned int a = 12;
Неявное выглядит так:
int a = 12u;
Float и double определяют числа с точкой. Числа float представляются в виде -2.3 или 3.34. Double используется для большей точности - после разделителя целой и дробной части указывается больше цифр. Этот тип занимает больше места в памяти, чем float.
double a = 12.4567;
Void имеет пустое значение. Он определяет функции, которые ничего не возвращают. С помощью этого спецификатора указывается пустое значение в аргументах методов. Указатели, которые могут принимать любой тип данных, также определяются как void.
Логический тип Bool
Применяется в проверках условий и циклах. Имеет всего два значения:
- истина;
- ложь.
Булевые значения могут преобразовываться в значение типа int. True эквивалентно единице, false - нулю. Преобразование типов предусмотрено только между bool и int, в противном случае компилятор выдаст ошибку.
int x = 123;if (x) { //Error: "Cannot implicitly convert type 'int' to 'bool'"};if (x != 0) // The C# way{}
Строки и массивы
Массивы относятся к сложными типам даным в Си. ЯП не работает со строками так же, как это делает Джаваскрипт или Руби. В Си все строки являются массивами элементов символьного значения. Строки оканчиваются нулевым байтом “