![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
//Эта программа выводит сообщение на экран
#include “stdafx.h”
#include <iostream>
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 предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:
Дата публикования: 2015-10-09; Прочитано: 489 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!