На этом шаге мы рассмотрим перечислимые и логические типы.
Мы уже знаем, что в языке С, наряду с рассмотренными типами переменных (int, char, float), существуют и другие типы данных, сведения о которых необходимо уточнить:
Попробуйте выполнить следующую программу, используя проверку содержимого переменных с помощью точек останова, образованных отладчиком:
void main () { int i=-10; unsigned int j=i; }
Вы убедитесь, что число j огромно. И все из-за того, что знаковый разряд, в котором была единица (т. к. число в переменной i отрицательное), стал участвовать в величине числа - стал его неотъемлемой частью;
Кроме того, существуют также следующие типы данных: 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
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); }
На следующем шаге мы рассмотрим константы.