При рассмотрении типов переменных в Си и C++ следует различать понятия базового типа и конструкции, позволяющей строить новые типы на основе уже построенных. Базовых типов совсем немного — это целые и вещественные числа, которые могут различаться по диапазону возможных значений (или по длине в байтах) и, в случае языка C++, логический тип . К конструкциям относятся массив , указатель и структура, а также класс в C++.
Базовые типы
В языке Си используются всего два базовых типа: целые и вещественные числа. Кроме того, имеется фиктивный тип void («пустота»), который применяется либо для функции, не возвращающей никакого значения, либо для описания указателя общего типа (когда неизвестна информация о типе объекта, на который ссылается указатель).
В C++ добавлен логический тип.
Целочисленные типы
Целочисленные типы различаются по длине в байтах и по наличию знака. Их четыре — char , short , int и long . Кроме того, к описанию можно добавлять модификаторы unsigned или signed для беззнаковых (неотрицательных) или знаковых целых чисел.
Язык Си для начинающих / #2 — Переменные и типы данных
Тип int
Самый естественный целочисленный тип — это тип int , от слова integer — целое число. Тип int всегда соответствует размеру машинного слова или адреса. Все действия с элементами типа int производятся максимально быстро. Всегда следует выбирать именно тип int , если использование других целочисленных типов не диктуется явно спецификой решаемой задачи. Параметры большинства стандартных функций, работающих с целыми числами или символами, имеют тип int . Целочисленные типы были подробно рассмотрены в «лекции 2» . Подчеркнем еще раз, что целочисленные переменные хранят на самом деле не целые числа, а элементы кольца вычетов по модулю m , где m — степень двойки.
В современных архитектурах элемент типа int занимает 4 байта, т.е. m = 2 32 . Элементы типа int трактуются в Си как числа со знаком. Минимальное отрицательное число равно -2 31 = -2147483648 , максимальное положительное равно 2 31 -1 = 2147483647 .
При описании переменной сначала указывается базовый тип, затем — имя переменной или список имен, разделенных запятыми, например,
int x; int y, z, t;
При описании переменных можно присваивать им начальные значения:
int maxind = 1000; int a = 5, b = 7;
Кроме типа int , существуют еще три целочисленных типа: char , short и long .
Тип char
Тип char представляет целые числа в диапазоне от -128 до 127 . Элементы типа char занимают один байт памяти. Слово » char » является сокращением от character , что в переводе означает «символ». Действительно, традиционно символы представляются их целочисленными кодами, а код символа занимает один байт (см. лекцию 3). Тем не менее, подчеркнем, что элементы типа char — это именно целые числа, с ними можно выполнять все арифметические операции. С математической точки зрения, элементы типа char — это элементы кольца вычетов m = Z256 . Стандарт Си не устанавливает, трактуются ли элементы типа char как знаковые или беззнаковые числа, но большинство Си-компиляторов считают char знаковым типом. Примеры описаний переменных типа char :
char c; char eof = (-1); char letterA = ‘A’;
В последнем случае значение переменной » letterA » инициализируется кодом латинской буквы ‘A’ , т.е. целым числом 65 . В Си символьные константы записываются в одинарных апострофах и означают коды соответствующих символов в кодировке ASCII. Рассмотрим следующий пример:
char c = 0; char d = ‘0’;
Здесь переменная c инициализируется нулевым значением, а переменная d — значением 48 , поскольку символ ‘0’ имеет код 48 .
Типы short и long
Слова short и long означают в Си короткое и длинное целое число со знаком. Стандарт Си не устанавливает конкретных размеров для типов short и long . В самой распространенной в настоящее время 32-разрядной архитектуре переменная типа short занимает 2 байта (диапазон значений — от -32768 до 32767 ), а тип long совпадает с типом int , размер его равен четырем байтам. Примеры описаний:
short s = 30000; long x = 100000; int y = 100000;
В 32-разрядной архитектуре переменные x и y имеют один и тот же тип.
Модификатор unsigned
Типы int , short и long представляют целые числа со знаком. Для типа char стандарт Си не устанавливает явно наличие знака, однако большинство компиляторов трактуют элементы типа char как целые числа со знаком в диапазоне от -128 до 127 . Если необходимо трактовать целые числа как неотрицательные, или беззнаковые, следует добавить модификатор unsigned при описании переменных. Примеры:
unsigned char c = 255; unsigned short s = 65535; unsigned int i = 1000000000; unsigned j = 1;
При описании типа » unsigned int » слово » int » можно опускать, что и сделано в последнем примере.
Следует по возможности избегать беззнаковых типов, поскольку арифметика беззнаковых чисел не на всех компьютерах реализована одинаково и из-за этого при переносе программы с одной платформы на другую могут возникнуть проблемы. По этой причине в языке Java беззнаковые числа запрещены.
Имеется также модификатор signed (знаковый). Его имеет смысл использовать на тех платформах, в которых тип char является беззнаковым. Пример описания:
signed char d = (-1);
Вещественные типы
Вещественных типов два: длинное вещественное число double (переводится как «двойная точность») и короткое вещественное число float (переводится как «плавающее»). Вещественные типы были подробно рассмотрены в разделе 1.4.2. Вещественное число типа double занимает 8 байтов, типа float — 4 байта.
Тип double является основным для компьютера. Тип float — это, скорее, атавизм, оставшийся от ранних версий языка Си. Компьютер умеет производить арифметические действия только с элементами типа double , элементы типа float приходится сначала преобразовывать к double . Точность, которую обеспечивает тип float , низка и не достаточна для большинства практических задач. Все стандартные функции математической библиотеки работают только с типом double . Рекомендуем вам никогда не использовать тип float !
Примеры описаний вещественных переменных:
double x, y, z; double a = 1.5, b = 1e+6, c = 1.5e-3;
В последних двух случаях использовалось задание вещественных констант в экспоненциальной форме (см. раздел 1.4.2).
Логический тип
В языке Си специального логического типа нет, вместо него используются переменные целого типа. Значению «истина» соответствует любое ненулевое целое число, значению «ложь» — ноль. Например, в Си допустим такой фрагмент программы:
int b; double s; . . . if (b)
Здесь целочисленная переменная b используется в качестве условного выражения в операторе if («если»). Если значение b отлично от нуля, то выполняется тело оператора if , т.е. переменной s присваивается значение 1.0 ; если значение b равно нулю, то тело оператора if не выполняется.
На самом деле, приведенный пример представляет собой дурной стиль программирования. Гораздо яснее выглядит следующий фрагмент, эквивалентный приведенному выше:
if (b != 0)
В более строгом языке Java второй фрагмент корректен, а первый нет.
Язык C++ вводит логический тип bool в явном виде (отметим, что этот тип появился в C++ далеко не сразу!). Переменные типа bool принимают два значения: false и true (ложь и истина). Слова false и true являются ключевыми словами языка C++.
Примеры описания логических переменных в C++:
bool a, b; bool c = false, d = true;
Оператор sizeof
Переменная одного и того же типа на разных платформах может занимать различное число байтов памяти. Язык Си предоставляет программисту возможность получить размер элемента данного типа или размер переменной в байтах, для этого служит оператор sizeof . Аргумент sizeof указывается в круглых скобках, он может быть типом или переменной. Рассмотрим несколько примеров. Пусть определены следующие переменные:
int i; char c; short s; long l; double d; float f; bool b;
Тогда приведенные ниже выражения в 32-разрядной архитектуре имеют следующие значения:
sizeof(i) | sizeof(int) | 4 |
sizeof(c) | sizeof(char) | 1 |
sizeof(s) | sizeof(short) | 2 |
sizeof(l) | sizeof(long) | 4 |
sizeof(d) | sizeof(double) | 8 |
sizeof(f) | sizeof(float) | 4 |
sizeof(b) | sizeof(bool) | 1 |
Тип void
Слово void означает «пустота». Тип void в Си обозначает отсутствие чего-либо там, где обычно предполагается описание типа. Например, функция, не возвращающая никакого значения, в Си описывается как возвращающая значение типа void :
void f(int x);
Другое применение ключевого слова void состоит в описании указателя общего типа, когда заранее не известен тип объекта, на который он будет ссылаться.
Источник: intuit.ru
Ruby on Rails c нуля!
Нужно быть полнейшим идиотом для того, чтобы не понять по заголовку о чем идет речь в статье. Очевидно, что читатели RubyDev в совершенстве адекватные люди с IQ не ниже среднего и достаточно широкими энциклопедическими знаниями и кругозором и потому с места мы сразу прыгаем в карьер минуя абсолютно бесполезное разлогое введение в тему статьи.
Переменные
Переменные — это именованные, понятные человеку ссылки на данные. Переменные в языке Си являются статическим и строготипизированными. На практике это проявляется в следующем:
- Переменная должна быть объявлена перед использованием.
- При объявлении переменной должен быть определен ее тип данных, а точнее тип данных, на который она ссылается.
- Тип данных переменной остается неизменным на протяжении всего выполнения программы.
- Переменная бронирует ячейку в памяти, которая соответствует указанному типу данных и не может эту ячейку как-либо расширить. По этой причине необходимо осторожно подбирать тип данных для того, чтобы быть уверенным, что памяти зарезервированной переменной хватит для сохранения данных.
Если сравнивать переменные Си и Ruby, то они весьма отличаются друг от друга. Например переменные в Ruby являются не статическими, но динамическими и не типизированными. Переменная в Ruby может ссылаться на любой тип данных и постоянно менять его. Это связано с тем, что в Ruby переменная не резервирует область памяти, а ссылается на объект в виртуальной таблице объектов.
Визуально это можно представить себе как две таблицы, одна содержит два столбца, в одном хранятся все объекты (их данные), а в другом — идентификатор object_id. Во второй таблице у нас имеются также два столбца, в одном хранится object_id, а в другом имя переменной. Когда вы присваиваете переменной другое значение, то во второй таблице напротив имени переменной просто меняется object_id.
В Си все совсем иначе. Переменная при объявлении захватывает область памяти, размер которой соответствует типу переменной, например 1 байт. Далее переменная ссылается на эту область данных, а вы можете помещать в нее любое значение.
Типы данных Си
Знакомство с типами данных традиционно принято начинать с типа char. Не будем изменять традициям и начнем с char.
CHAR
char — это тип данных, которые требуют для хранения 1 байт памяти. Этого количества памяти хватает для хранения символа ASCII, или чисел от -128 до +127, или от 0 до +255. Тип char применяется для хранения ASCII последовательностей, но может интерпретироваться и как число.
#include int main(void) < char a = ‘a’; printf(«%c ->%dn», a, a); printf(«%d — 5 = %dn», a, a — 5); return 0; >
В результате выполнения программы будет напечатано следующее:
a -> 97
97 — 5 = 92
Целочисленные INT типы
Тип int используется для хранения целых чисел и занимает не менее 4 байтов памяти. Тип int является, так сказать, семейством типов. int типов существует несколько: short int, long int и long long int (C99). Признаться честно, все типы являются платформа-зависимыми, то есть, говоря, что int занимает 4 байта, а не подразумеваю, что 4 байта и только так.
На некоторых платформах int может занимать, например 8 байт памяти, а на других 2. Насколько мне известно, стандарт Си все же регламентирует минимальное значение основных типов и потому, наверное, можно быть уверенным в том, что int зарезервирует минимум 4 байта. Лично на моей машине int вмещает число 2147483647, long int занимает столько же места, как и int. Тип short int занимает минимум 2 байта.
Помимо int существуют short int и long int. Первый занимает минимум 1 байт, а второй обязан быть не менее int, но чаще всего занимает 4 байта.
#include int main(void)
Программа напечатает следующую строку:
2147483647, 32767, 2147483647
Числа с плавающей точкой
Для хранения чисел с плавающей точкой, используются специальные типы данных: float, double и long double. Каждый из них занимает 4, 8 и 12 байт соответственно.
Чтобы узнать достоверно, какой размер памяти занимает каждый тип необходимо воспользоваться функцией sizeof():
#include int main(void)
Эта программа напечатает следующий результат:
—— Integer numbers —— type | size char | 1 short int | 2 int | 4 long int | 4 long long int | 8 —— Floating point numbers —— float | 4 double | 8 long double | 12
Signed и Unsigned типы
Численные типы данных могут быть signed и unsigned. Signed типы означают, что переменная такого типа может хранить число со знаком, а unsigned, наоборот, что переменная хранит число без знака. Когда я писал выше, что char может хранить числа в диапазоне от -128 до +127, или от 0 до +255, то в первом случае подразумевался тип signed char, а во втором unsigned.
Если переменная не должна хранить отрицательное число, то ей необходимо прописать unsigned-тип, так вы более явно укажете, что число может быть только положительным и увеличите диапазон положительных значений в 2 раза (с 127 до 255, например). Вам не обязательно писать signed, если переменная может иметь в качестве значения отрицательное число. Если signed или unsigned не указаны, то переменная по умолчанию объявляется с signed типом.
Строки и массивы
Хочу вас обрадовать. В Си нет строк. Нет строк таких как в Ruby, JavaScript или даже богомерзком PHP. Строки в Си представляют собой массив символов. Единственное чем строки отличаются от массива — это возможность использовать более краткий и лаконичный синтаксис их объявления, а еще строка должна завершаться символом окончания строки — « «. Ниже приведен пример специфичного для строк синтаксиса их объявления, а еще «классический» синтаксис создания массива.
#include int main(void) < char a[] = «string»; char b[] = < ‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, ‘