Новые типы переменных

   
На этом шаге мы рассмотрим перечислимые и логические типы.

   
Мы уже знаем, что в языке С, наряду с рассмотренными типами переменных (int, char, float), существуют и другие типы данных, сведения о которых необходимо уточнить:

  • double - указывает, что данные имеют тип "с плавающей точкой" двойной точности;
  • long - указывает, что данные имеют тип "целое со знаком", но по сравнению с данными типа int занимают в 2 раза больше памяти;
  • short int - короткое целое со знаком, занимает в 2 раза меньше памяти, чем int;
  • long double - длинное удвоенное с плавающей точкой;
  • unsigned char - если в переменной, объявленной с таким типом данных, будет находиться число (которое, естественно, будет изображено кодами цифр), то знаковый бит такого числа
    будет подавлен, т. е. не будет учитываться как знак числа, а только как элемент числа. Это исказит размер отрицательных чисел.

       Примечание.
    Знаковый бит всегда располагается в старшем (находящемся слева) разряде. Биты в записи числа нумеруются справа налево: 0, 1, 2,... Это означает, что если под число отведено 4 байта (т. е. 32 бита),
    то самый старший бит 31-й.

       
    Попробуйте выполнить следующую программу, используя проверку содержимого переменных с помощью точек останова, образованных отладчиком:

    void main ()
    {
      int i=-10;
      unsigned int j=i;
    }
    

       
    Вы убедитесь, что число j огромно. И все из-за того, что знаковый разряд, в котором была единица (т. к. число в переменной i отрицательное), стал участвовать в величине числа -
    стал его неотъемлемой частью;

  • unsigned int - аналогичен типу unsigned char;
  • unsigned long - длинное целое без знака. Последствия того, что переменная имеет тип "без знака", для отрицательных чисел уже рассмотрены.

   
Кроме того, существуют также следующие типы данных: enum и bool. Рассмотрим каждый из них подробнее.

   
Перечислимый тип данных enum позволяет задавать мнемонические значения для множеств целых значений (т. е. обозначать значения в соответствии с их смыслом).

   
Допустим, нам надо работать в программе с наименованиями дней недели (например, проверять, что текущий день - понедельник). Пока не было типа данных enum, надо было как-то задавать
дни недели числами и работать с этими числами. Для дней недели это и не особенно сложно: каждый помнит, что седьмой день это воскресенье, а первый - понедельник (хотя в английском варианте
первым днем считается как раз воскресенье).

   
Но бывают множества, как говорят, и "покруче", чем дни недели, элементы которых не упомнишь. Поэтому с помощью типа enum можно добиться большей наглядности и лучшего
понимания программы. Приведем пример программы с использованием типа enum.

void main()
{
  enum days {sun, mon, tues, wed, thur, fri, sat} anyday; 
  enum sex {man, wom} pol; 
  anyday=sun; 
  pol=wom;
  if (anyday==0 && pol == worn)    // можно писать либо anyday==sun,
                                   // либо anyday==0; 
}

   
Запись

enum days {sun, mon, tues, wed, thur, fri, sat} anyday

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

  enum days {sun, mon, tues, wed, thur, fri, sat}; //ввели тип 
  days anyday, оtherdays; //объявили 2 переменные данного типа

   
В любом случае после этого переменной anyday (или, как во втором случае переменной otherdays) можно присваивать значения из определенного в enum списка:

  anyday=sun; 

   
Если список приведен в виде enum days {sun, mon, tues, wed, thur, fri, sat}, то подразумевается, что его элементы имеют последовательные целые числовые значения: 0, 1, 2,... (т. е. вместо
anyday==sun можно писать anyday==0). Список, указанный в enum, можно при объявлении инициализировать другими целыми значениями. Например, имеем перечислимый
тип "кувшины (объемы в литрах)":

  enum {Vol1=5, Vol2=7, Vol3=9, Vol4, Vol5, Vol6} pitchers;

   
У первого, второго и третьего элементов этого множества числовые значение соответственно равны 5, 7 и 9. Остальным элементам, не определенным нами, компилятор присвоит последовательные (через
единицу) значения, начиная со значения последнего определенного элемента (т. е. с Vol3): Vol4 получит значение Vol3+1 (т. е. 10), Vol5 - значение 11, Vol6 - значение 12.

   
В приведенной выше программе заданы две имени перечислимого типа: days (дни) и sex (пол). Это пока шаблоны. А на их основе определены собственно
"рабочие" перечислимые переменные (т. е. те, с которыми и надо работать). Затем определенным таким образом переменным можно присваивать значения элементов перечислимых множеств и сравнивать их.

   
Булев тип данных bool. Переменные этого типа могут принимать только два значения: false (ложь) и true (истина). Они используются для проверки логических
выражений. Числовые значения false (ложь) и true (истина) заранее предопределены: значение false численно равно нулю, а значение true - единице.
Эти так называемые литералы (постоянные символьные значения) сами выступают в роли переменных - им можно присваивать значения (соответственно ноль и единицу).

   
Вы можете преобразовать некоторую переменную типа bool в некоторую переменную типа int. Такое числовое преобразование устанавливает значение false равным нулю, а
значение true - единице.

   
Вы можете преобразовать перечислимые и арифметические типы в переменные типа bool: нулевое значение преобразовывается в false, а ненулевое - в true.

   
Существует одноименная функция bool(), которая преобразует арифметические типы в булевы.

   
Ниже пример программы с использованием булевых переменных и булевой функции. Поставьте с помощью отладчика точку останова на первом операторе и двигайтесь по программе пошагово,
каждый раз нажимая клавишу F10. Перед каждым следующим шагом проверяйте содержимое переменных. Понаблюдайте, как изменяются значения переменных.

void main()
{
  //проверка преобразований типов int, float в bool
  int   i = 2;
  bool  b = i; 
  float j = 2.2; 
  bool  a = bool(j); 
  j = 0.0;
  a = bool(j);
}

   
На следующем шаге мы рассмотрим константы.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий