Программирование для карманных компьютеров
Шрифт:
int х, у, z;
В С++ при объявлении обязательно должен указываться тип. Основные типы, применяемые в C++, перечислены в следующем списке.
? Логический тип (bool).
? Символьный тип (char, wcharjt).
? Целые типы (short, int, long).
? Типы с плавающей точкой (float, double).
? Перечислимые типы (enum).
? Тип void используется для указания на отсутствие информации.
? Указатели.
? Массивы.
? Ссылки.
? Структуры данных и классы.
В файле MyExp.cpp роазмещены несколько объявлений. Например, в блоке 3 присутствует следующий фрагмент кода:wchar_t *szStr; // объявлена переменная szStr,
//которая является указателем (*) на тип wchar_t
wchar_t mstr[256]; // объявлен массив mstr элементов типа wchar_t
//с количеством элементов 256В блоке 4 помимо объявлений используется и инициализация переменных:
MSG msg; //объявлена переменная msg типа MSG
int rc = 0; // объявлена переменная rc с типом int,
// переменная была инициализирована значением 0
Базовые (фундаментальные) типы
Логический типПеременные
Упражнение 4.1 (продолжение)
13. В файле MyExp.h следует добавить в конец блока 4 объявление функцииvoid f2;.
14. В файле MyExp.сpp следует добавить в конец блока 3 объявления символьных массивов:
char mm[256]; charnn[32];
15. В конец файла MyExp.сpp нужно добавить блок 14, с кодом, который показан в листинге 4.5. Листинг 4.5
// Блок 14
void f2{
bool i = false;
int j = 10;
mm[0] = \0;
sprintf(nn, «%d», j);
strcat(mm, " j = ");
strcat(mm, nn);
strcat(mm, «\n»);
i=7;
sprintf(nn, «%d», i);
strcat(mm, " i = ");
strcat(mm, nn);
strcat(mm, «\n»);
j = j+i;
sprintf(nn, «%d», j);
strcat(mm, " j+i = ");
strcat(mm, nn);
strcat(mm, «\n»);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}16. Изменить вторую по счету ветвь case в блоке 11, как показано в листинге 4.6. Листинг 4.6
case 50: {
f2;
}
break;ПРИМЕЧАНИЕ. Каждый новый фрагмент кода будет добавляться в новые ветви case оператора выбора switch.
Теперь можно запустить программу. Нажатие клавиши 2 на клавиатуре приведет к появлению в окне последовательности изменения значений переменных. Как и ожидалось, присвоение целочисленной переменной j значения 10 прошло без проблем. А вот присвоение значения 7 переменной i типа bool усекло значение 7 до единицы, и при сложении i и j результат получился равным 11, а не 17. Символьный тип
В переменной типа char может храниться один из символов, входящих в набор символов используемой реализации ОС. Для хранения символа отводится 8 бит, так что всего можно использовать 256 значений этого типа. Можно с достаточной уверенностью предположить, что в набор символов конкретной реализации входят цифры, 26 букв английского алфавита и некоторые основные знаки пунктуации. Все остальные предположения о составе символьного набора не могут считаться достоверными.
Каждая символьная константа имеет числовое значение, отображающее ее порядковый номер в символьном наборе. Тип char может быть как знаковым (signed char), так и беззнаковым (unsigned char). По умолчанию char трактуется как знаковый тип, поэтому если нужно получить беззнаковое преобразование, необходимо явно объявлять переменную типа unsigned char.
Для хранения символов больших наборов, таких как Unicode, используется тип wchar_t.
Символьные типы являются интегральными. Как и к логическим типам, к ним можно применять арифметические и логические операции. Кроме того, имеется ряд символьных констант, называющихся ESC-последовательностями, играющих особые роли при работе с символьными строками. Основные ESC-последовательности приведены в следующем списке.
\'\n\' – новая строка,
\'\t\' – горизонтальная табуляция,
\'\v\' – вертикальная табуляция,
\'\r\' – перевод каретки,
\'\f\' – перевод страницы,
\'\a\' – звуковой сигнал,
\'\ – одиночная кавычка (апостроф),
\'\" – двойная кавычка,
\'\\ – обратная косая черта.
Целые типыК целочисленным типам относятся int, short int и long int. Вместо двух последних можно применять обозначения short и long. Кроме того, целочисленный тип может быть знаковым и беззнаковым – signed и unsigned. Обычный тип int всегда является знаковым. Если нужно получить беззнаковый тип, следует явно объявить переменную как unsigned. Объявление unsigned равнозначно объявлению unsigned int. Конкретное значение размеров переменной зависит от реализации ОС.
Типы с плавающей точкойЭти типы представлены тремя размерами – float (одинарная точность), double (двойная точность) и long double (расширенная точность). Конкретное значение размеров переменных зависит от реализации ОС.
РазмерыРазмер переменных базовых типов в С++ зависит от реализации ОС. Размеры объектов выражаются в единицах размера char. Исходя из предположения, что переменные типа char занимают один байт, размеры любых других объектов в байтах можно определить при помощи оператора sizeof, как это показано в тестовом примере.
Упражнение 4.1 (продолжение)
17. Объявить в файле MyExp.h функцию f3 и дописать в блок 11 еще одну ветвь case, код которой приведен в листинге 4.7.
Листинг 4.7case 51: {
f3;
}
break;18. Добавить в конец файла MyExp.cpp еще один блок, код которого приведен в листинге 4.8. Листинг 4.8
// Блок 15
void f3{
mm[0] = \0;
sprintf(nn, «%d», (sizeof(char)));
strcat(mm, " Size of type char = ");
strcat(mm, nn);
strcat(mm, «\n»);
sprintf(nn, «%d», (sizeof(wchar_t)));
strcat(mm, " Size of type wchar_t = ");
strcat(mm, nn);
strcat(mm,
«\n»);sprintf(nn, «%d», (sizeof «Hello, Word!»));
strcat(mm, « Size of string \»Hello, Word!\" = ");
strcat(mm, nn);
strcat(mm, «\n»);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}
Результат работы этого блока выводится на экран при нажатии клавиши 3.
ЛитералыЛитералы – это символьные значения переменных и констант, которые записываются в тексте программы. Для типа bool литералами будут выражения true и false, для типа char литералом будет символ, заключенный в одинарные кавычки.
Литералы для целых чисел различаются по системе счисления и могут иметь десятеричную, восьмеричную и шестнадцатеричную форму записи. Десятеричная форма записи выглядит наиболее привычно. И в качестве литералов используются обычные числа. Восьмеричный литерал обязательно начинается с нуля – 00, 02, 077. Шестнадцатеричный литерал начинается с префикса Ох – 0x0, 0x2, 0x3f.
Для явной записи беззнаковых литералов можно использовать суффикс U – 23U, а суффикс L можно использовать для явной записи литерала типа long – 23L. Рекомендуется для записи числовых значений использовать десятеричные литералы, а восьмеричные и шестнадцатеричные литералы применять для записи цепочек битов.
Для записи значений с плавающей точкой используются следующие формы:
? 1.23
? 23
? 0.23
? 1.
? 1.0
? 1.2e10
? 1.23e-10
В записи литералов с плавающей точкой не должно быть пробелов. По умолчанию, литералы с плавающей точкой имеют значение типа double. Если необходимо определить литерал типа float, это можно сделать при помощи суффикса f – 2.9999f.
Void Это фундаментальный тип, который никогда не используется самостоятельно. Не бывает объектов типа void. Этот тип указывает на то, что другой тип, в сочетании с которым он используется, не имеет значения, имеет неопределенное значение или неизвестное значение. В следующем фрагменте кода приводятся примеры применения этого фундаментального типа.void f; //эта функция не возвращает значение
void* pnt; //это указатель на объект неизвестного типа
void х; //эта запись неверна, объектов типа void не существует
Перечисления При помощи перечислений устанавливается некоторый набор значений, определяемых пользователем. Перечисление объявляется при помощи ключевого слова enum. В качестве элементов перечисления можно определить именованные целые константы:enum {DEC, JAN, FEB};
В этом случае определены три целые константы. Если константы не инициализируются явно, то по умолчанию им присваиваются значения, начинающиеся с нуля и увеличивающиеся на единицу для каждой следующей константы. Таким образом значение DEC будет равно 0, JAN – 1, а FEB – 2. Перечислению можно присвоить имя, как это показано в следующем фрагменте:
enum year{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};
Константы в перечислении можно инициализировать значениями, отличными от индексных, которые присваиваются по умолчанию:
enum times{SAVE=10,SLEEP=20,STOP=30};
Если инициализируется только часть элементов перечисления, то те элементы перечисления, которые указаны после инициализированных, будут получать возрастающие значения, отсчитываемые от того значения, которое они получили при инициализации. В следующем фрагменте элемент STOP будет инициализирован значением 21.
enum times{SAVE=10,SLEEP=20,STOP};
Области видимости и имена
Объявление вводит имя в область видимости. Это значит, что имя может использоваться только в определенной части текста программы, и, где именно будет использоваться объявленное имя, зависит от того, в каком месте программы оно было объявлено.
Для имени, объявленного в теле функции ( локальное имя), область видимости начинается с места объявления и заканчивается там, где заканчивается блок, внутри которого было объявлено имя. Блоком считается фрагмент кода, заключенный в фигурные скобки.
Имя называется глобальным, если оно объявлено вне любой функции или класса. Область видимости глобального имени простирается от места объявления до конца файла, содержащего объявление. Внешнее по отношению к текущему блоку имя, как глобальное, так и локальное, может быть перекрыто (то есть подменено) объявлением этого же имени внутри текущего блока. В этом случае в памяти образуется два или более разных объектов с одним и тем же именем. То есть имя внутри блока может быть замещено и будет ссылаться на другую область памяти. При выходе из блока имя восстанавливает свое значение. К замещенному глобальному имени можно обратиться при помощи оператора::. К скрытому локальному имени обратиться невозможно. Этот механизм иллюстрируется в упражнении.
Упражнение 4.1 (продолжение)
19. Добавить в программу код, приведенный в листинге 4.9. Нужно при этом объявить соответствующую функцию и добавить еще одну ветвь case.
Листинг 4.9
// Блок 16
void f4{
//В начале файла объявлена глобальная переменная mm, указывающая на массив
//типа char, то есть на массив символов, то есть на строку. Устанавливая
//первым элементом массива 0, мы показываем, что это строка пустая. Затем,
//при помощи функции strcat, мы добавляем к этой строке строку Hello, Global
//Word! с символом переноса на другую строку \n.
mm[0] = \0;
strcat(mm, «Hello, Global Word! \n»);
//Снова объявляем переменную mm, чем скрываем имя глобальной переменной mm.
//Теперь обращаясь к mm, мы обращаемся к локальному имени, указывающему на
//другую область памяти. В эту другую область мы записываем строку Hello,
//Local Word!
char mm[256];
mm[0] = \0;
strcat(mm, «Hello, Local Word! \n»);
//К строке из локальной переменной mm, мы дописываем строку из глобальной