Листинг 1.8

//Эта программа выводит сообщение на экран

#include “stdafx.h”

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

puts("Hello world!");

return 0; //Возврат в операционную систему

}

Однако если комментарий занимает больше одной строки, каждая строка должна начинаться с символов //.

Литералы. Идентификаторы, константы, переменные, ключевые слова.Литералом называется любой элемент данных, который вводится непосредственно в инструкции языка C++. Литералом может являться любое число, символ или строка, которые вводятся как начальные значения переменной. Например: cout=8, где число 8 являться литералом.

Каждой программе для работы необходима информация - данные. Данные вводятся в компьютер, он обрабатывает их, следуя нашим инструкциям, затем выдает результат.

Идентификатор - это имя программного объекта. В идентификаторе могут ис­пользоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, sysop, SySoP и SYSOP - три различных имени. Первым символом идентификатора может быть буква или знак подчерки­вания, но не цифра. Пробелы внутри имен не допускаются.

Длина идентификатора по стандарту не ограничена, но некоторые компиляторы и компоновщики налагают на нее ограничения. Идентификатор создается на эта­пе объявления переменной, функции, типа и т.п., после этого его можно исполь­зовать в последующих операторах программы. При выборе идентификатора не­обходимо иметь в виду следующее:

- идентификатор не должен совпадать с ключевыми словами именами используемых стандартных объектов языка;

- не рекомендуется начинать идентификаторы с символа подчеркивания, по­скольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

- на идентификаторы, используемые для определения внешних переменных, налагаются ограничения компоновщика (использование различных компо­новщиков или версий компоновщика накладывает разные требования на име­на внешних переменных).

Константами называют неизменяемые величины. Различаются целые, вещест­венные, символьные и строковые константы. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду. Форматы констант, соответствующие каждому типу, приведены в таблице 1.3.

Таблица 1.3 - Форматы констант, соответствующие каждому типу

Константа Формат Примеры
Целая Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль 8, 0, 199226
Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7) 01, 020, 07155
Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,l,2,3,4,5,6,7,8,9,A,B,C,D,E,F) 0хА, 0x1B8, 0X00FF
Вещественная Десятичный: [цифры].[цифры] 5.7, .001, 35.
Экспоненциальный: [цифры][.][цифры]Е[+-][ЦиФры] 0.2Е6, .lle-3, 5E10
Символьная Один или два символа, заключенных в апострофы ‘А’, ‘ю’, ‘*’, ‘db’, ‘\0’, ‘\n’, ‘\012’, ‘\x07\x07’
Строковая Последовательность символов, заключенная в кавычки “Здесь был Vasia”, “\tЗначение r=\0xF5\n”



Если требуется сформировать отрицательную целую или вещественную кон­станту, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -0хЗС, -4.8, -0.1е4.

Вещественная константа в экспоненциальном формате представляется в виде ман­тиссы и порядка. Мантисса записывается слева от знака экспоненты (Е или е), по­рядок - справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. Обратите вни­мание, что пробелы внутри числа не допускаются, а для отделения целой части от дробной используется не запятая, а точка.

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char. Двухсимвольные константы занимают два байта и имеют тип int, при этом первый символ размещается в байте с меньшим адресом.

Символ обратной косой черты используется для представления:

- кодов, не имеющих графического изображения (например, \a - звуковой сиг­нал, \n - перевод курсора в начало следующей строки);

- символов апострофа ( ' ), обратной косой черты ( \ ), знака вопроса (?) и ка­вычки ( " );

- любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от 0 до 255.

Определить константу - это, значит, сообщить компилятору C ее имя, тип и значение. Для определения константы в языке C перед функцией main() часто помещают директиву #define для объявления констант и макроопределений. Однако использование этой директивы сопряжено с появлением трудно диагностируемых ошибок, лучшей альтернативой для констант является использование переменных с модификатором const. Такие переменные носят название константных переменных и объявляются следующий образом:



const = ;

Наличие инициализатора при объявлении константной переменной обязательно. Значение константной переменной не может быть изменено в процессе работы программы. Например:

const double pi = 3.1415926; // вещественная кон.

const int size = 400; // целая константа

const char new_line = ‘\n’; // символьная константа

const char topic[] = “Тема”; // строковая константа

В любой программе требуется производить вычисления. Для вычисления значений используются выражения, которые состоят из операндов, знаков операций и скобок. Операнды задают данные для вычислений. Операции задают действия, которые необходимо выполнить. Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной. Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Рассмотрим составные части выражений и правила их вычисления.

Переменная - это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения про­граммы значение переменной можно изменять. Перед использованием любая переменная должна быть описана. Пример описания целой переменной с именем а и вещественной переменной х:

int a; double x;

Общий вид оператора описания переменных:

[класс памяти] [const|volatile] тип имя[инициализатор];

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

- большие и малые буквы латинского алфавита,

- арабские цифры,

- символ подчеркивания ­«_».

Компилятор C++ рассматривает одну и ту же большую и малую буквы как разные символы. Например, переменные dx_1, Dx_1, dX_1, DX_1 имеют различные имена и являются, соответственно, разными литералами.

Первым символом в имени должна стоять буква или знак подчеркивания. Например: Num, _min, max_, sum_7, и так далее. Тем не менее, не рекомендуется использовать знак подчеркивания в качестве первого символа литерала, поскольку таковые в основном используются для системных нужд и определяют литералы собственно компилятора или операционной системы, например _UNICODE, литерал, используемый в директивах условной компиляции, если программа написана с использованием кодировки Unicode.

Определить переменную - это, значит, сообщить ее имя и тип компилятору C++. Объявление переменной можно совместить с ее инициализацией. В этом случае объявлений переменной записывают следующим способом:

= ;

Знак «=» обозначает инструкцию присваивания. Она предназначена для изменения значения переменных

=;

Разновидность операции присваивания

= ;

Имя переменной не должно совпадать с ключевыми словами языка C++, перечень которых, приведен в табл. 1.4.

Ключевые слова - это зарезервированные идентификаторы, которые имеют спе­циальное значение для компилятора. Их можно использовать только в том смыс­ле, в котором они определены.

Таблица 1.4 - Ключевые слова стандарта языка C++

asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default int static void
delete inline static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template

Описание переменной, кроме типа и класса памяти, явно или по умолчанию за­дает ее область действия. Класс памяти и область действия зависят не только от собственно описания, но и от места его размещения в тексте программы. Область действия идентификатора - это часть программы, в которой его мож­но использовать для доступа к связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной. Если переменная определена внутри блока, она называется локальной, область ее действия - от точки описа­ния до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца. Класс памяти определяет время жизни и область видимости программного объ­екта (в частности, переменной). Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления.

Время жизни может быть постоянным (в течение выполнения программы) и вре­менным (в течение выполнения блока).

Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью па­мяти. Чаще всего область видимости совпадает с областью действия. Исключе­нием является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее, к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимо­сти ::.

Для задания класса памяти используются следующие спецификаторы:

auto - автоматическая переменная. Память под нее выделяется в стеке и при не­обходимости инициализируется каждый раз при выполнении оператора, содер­жащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни - с момента описания до конца блока. Для глобальных переменных этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.

extern - означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены.

static - статическая переменная. Время жизни - постоянное. Инициализиру­ется один раз при первом выполнении оператора, содержащего определение пе­ременной. В зависимости от расположения оператора описания статические пе­ременные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны.

register - аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабаты­ваются как auto.

int a; // 1 глобальная переменная а

int main()

{

int b; // 2 локальная переменная b

extern int x; /* 3 переменная х определена в другом месте */

static int с; /* 4 локальная статическая переменная с */

а = 1; // 5 присваивание глобальной переменной

int a; // 6 локальная переменная а

а = 2; // 7 присваивание локальной переменной

::а = 3; // 8 присваивание глобальной переменной

return 0;

}

int x = 4; // 9 определение и инициализация х

В этом примере глобальная переменная a определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости - вся программа, кроме строк 6-8, так как в первой из них определяется локальная переменная с тем же именем, область действия которой начинается с точки ее описания и заканчивается при выходе из блока. Переменные b и с - локальные, область их видимо­сти - блок, но время жизни различно: память под b выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная с располагается в сег­менте данных и существует все время, пока работает программа.

Если при определении начальное значение переменных явным образом не зада­ется, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализи­руются.

Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами).

Описание переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе переменной и классе памяти, а оп­ределение содержит, кроме этого, указание компилятору выделить память в со­ответствии с типом переменной. В C++ большинство объявлений являются од­новременно и определениями. В приведенном выше примере только описание 3 является объявлением, но не определением.

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

Простые типы данных. Прежде чем использовать в программе на языке C++ какую-либо переменную, ее необходимо описать. Переменные в языке C++ могут быть описаны как в теле функции (между { }), так и вне ее. При описании переменной внутри функции область ее действия ограничена функцией. При описании переменной указать тип переменной и ее имя (идентификатор), для того, чтобы C++ должен зарезервировать достаточное количество памяти для хранения введенной информации. Разные типы данных занимают не одинаковый объем памяти. Не все функции языка C могут работать с данными любого типа.

В процессе написания программы необходимо определить все данные, которые будут использоваться, причем сделать это надо и для вводимой информации, и для результата. Данные классифицируются по типу значений, которые они содержат. Значение не обязательно означает числовую величину, но и буквы, слова, фразы.

Тип данных определяет:

- внутреннее представление данных в памяти компьютера;

- множество значений, которые могут принимать величины тина;

- операции и функции, которые можно применять к величинам типа.

Рассмотрим наиболее часто употребляемые простые типы языка C++:

- целые числа со знаком int, long, short,

- целые беззнаковые константы unsigned,

- символы, занимающие один байт char и два байта wchar_t,

- числа с плавающей точкой float, double.

Тип char определяет целочисленные переменные, занимающие один байт, в диапазоне от -128 до 127. Этот тип, как правило, применяется для символьных переменных (числовым значением является код символа).

Тип wchar_t определяет целочисленные переменные, занимающие два байта, в диапазоне от -32768 до 32767. Этот тип, как правило, применяется для символьных переменных в кодировке Unicode (числовым значением является код символа в кодировке Unicode).

Тип short определяет целые переменные, занимающие два байта, в диапазоне от -32768 до 32767. Этот тип используется для небольших целых чисел, в основном для управления циклами.

Тип long определяет целочисленные переменные, занимающие четыре байта, в диапазоне от -2147483647 до 2147483646.

В зависимости от компилятора и операционной системы тип int может быть эквивалентен либо типу short, либо типу long. Для компилятора Borland C++ Builder тип int эквивалентен типу long.

Беззнаковые типы unsigned определяяют беззнаковые целые числа. Это ключевое слово используется с другими типами данных для определения этого типа как беззнакового, т.е. только положительные числа и ноль. К беззнаковым типам относятся unsigned char, unsigned wchar_t, unsigned short, unsigned long, unsigned int. Тип unsigned эквивалентен типу unsigned int.

Тип float определяет переменные, занимающие четыре байта, для чисел с плавающей точкой в диапазоне от до

Тип double определяет переменные, занимающие восемь байт, для чисел с плавающей точкой в диапазоне от до . Также используется в научных расчетах, но может содержать до 15 значащих цифр.

Таблица 1.5 - Диапазоны значений простых типов данных на IBM PC

Тип Диапазон значений Размер (байт)
bool true и false
signed char -128 ... 127
unsigned char 0 ... 255
signed short int -32 768 ... 32 767
unsigned short int 0 ... 65 535
signed long int -2 147 483 648 ... 2 147 483 647
unsigned long int 0 ... 4 294 967 295
float 3.4e-38 ... 3.4c+38
double 1.7e-308 ... 1.7e+308
long double 3.4c-4932 ... 3.4e+4932

При описании данных достаточно ввести тип, за которым должен следовать список имен переменных. Например:

int tdw, _sek, g1o; char elen, ogi;

long kid, g2o; char isi ='j';

float z2_c; unsigned rib = 6;

double pi = 3.14159;

Операторы языка С++.Рассмотрим список всех операций, определенных в языке C++, в соответствии с их приоритетами (по убыванию приоритетов, операции с разны­ми приоритетами разделены чертой). В соответствии с количеством операндов, которые используются в операциях, они делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда).

Все приведенные в таблице 1.6 операции, кроме условной «? :», sizeof, селектора членов класса «.», доступа к области видимости «::» и оператора последовательного вычисления «,» могут быть пере­гружены.

Таблица 1.6 - Операции, определенные в С++

Операция Краткое описание
Унарные операции
:: Доступ к области видимости
. Селектор членов класса
-> Селектор членов класса
[ ] Индексация
( ) Вызов функции
++ Постфиксный инкремент
-- Постфиксный декремент
typeid Идентификация типа
dynamic_cast Преобразование типа с проверкой на этапе выполнения
static_cast Преобразование типа с проверкой на этапе компиляции
reinterpret_cast Преобразование типа без проверки
const_cast Константное преобразование типа
sizeof Размер объекта или типа
-- Префиксный декремент
++ Префиксный инкремент
~ Поразрядное отрицание
! Логическое отрицание
- Арифметическое отрицание (унарный минус)
+ Унарный плюс
& Взятие адреса
* Разадресация
new Выделение памяти
delete Освобождение памяти
() Преобразование типа
.* Селектор членов класса по указателю
->* Селектор членов класса по указателю
Бинарные и тернарные операции
* Умножение
/ Деление
% Остаток от деления
+ Сложение
- Вычитание
<< Сдвиг влево
>> Сдвиг вправо
< Меньше
<= Меньше или равно
> Больше
>= Больше или равно
== Равно
!= Не равно
& Поразрядная конъюнкция (И)
^ Поразрядное исключающее ИЛИ
| Поразрядная дизъюнкция (ИЛИ)
&& Логическое И
| | Логическое ИЛИ
? : Условная операция (тернарная)
= Присваивание
*= Присваивание с умножением
/= Деление с присваиванием
%= Остаток от деления с присваиванием
+= Сложение с присваиванием
-= Вычитание с присваиванием
<<= Сдвиг влево с присваиванием
>>= Сдвиг вправо с присваиванием
&= Поразрядное И с присваиванием
|= Поразрядное ИЛИ с присваиванием
^= Исключающее ИЛИ с присваиванием
throw Инициировать исключение
, Последовательное вычисление

Рассмотрим основные операции подробнее.

Операции увеличения и уменьшения на 1 (++ и --).Эти операции, называемые также инкрементом и декрементом, имеют две формы записи - префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результи­рующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется.

В отличие от других языков программирования в Си и C++ инструкция присваивания, выполняющая некоторое действие, может быть записана несколькими способами.

Например, вместо x = x + dx можно записать x += dx, вместо у = у*х можно записать у *= х а вместо i = i + 1 воспользоваться оператором инкремента и записать i++. Список наиболее часто используемых таких операций приведен в таблице 1.7.

Таблица 1.7 - Арифметические операции с присваиванием в C++

Наименование операции Выражение Эквивалентное выражение
Префиксный и постфиксный инкремент ++x или x++ x = x + 1
Префиксный и постфиксный декремент --x или x-- x = x - 1
Сложение с присваиванием x += y x = x + y
Вычитание с присваиванием x -= y x = x - y
Умножение с присваиванием x *= y x = x * y
Деление с присваиванием x /= y x = x / y
Взятие остатка с присваиванием x %= y x = x % y

Операндом операции инкремента в общем случае является так называемое L-значение (L-value). Так обозначается любое выражение, адресующее некоторый уча­сток памяти, в который можно занести значение. Название произошло от опера­ции присваивания, поскольку именно ее левая (Left) часть определяет, в какую область памяти будет занесен результат операции. Переменная является част­ным случаем L-зиачепия.

Операция определения размераsizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:


3151189459221486.html
3151236251727422.html
    PR.RU™