Основы программирования на языке С++

Основы программирования на языке С++

Алфавит, идентификаторы, ключевые слова и константы C++

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

  1. слова называют лексемами (элементарными конструкциями),
  2. словосочетания — выражениями, а
  3. предложения — операторами.
  • Лексемы образуются из символов,
  • выражения — из лексем и символов, а
  • операторы — из символов, выражений и лексем.

Далее рассмотрим алфавит языка программирования C++ и его лексемы.

Алфавит C++

Алфавит (или множество литер) языка программирования C++ основывается на множестве символов таблицы кодов ASCII. Алфавит C++ включает:

  • строчные и прописные буквы латинского алфавита (мы их будем называть буквами),
  • цифры от 0 до 9 (назовём их буквами-цифрами),
  • символ '_' (подчерк - также считается буквой),
  • набор специальных символов: " < >, | [ ] + - % / \ ; ' : ? < > = ! & #

Алфавит C++ служит для построения слов, которые в C++ называются лексемами. Различают пять типов лексем:

  • идентификаторы,
  • ключевые (зарезервированные) слова,
  • символы (знаки) операций,
  • символы управления препроцессором
  • разделители (скобки, точка, запятая, пробельные символы)
  • литералы

Почти все типы лексем (кроме ключевых слов и идентификаторов) имеют собственные правила словообразования, включая собственные подмножества алфавита.

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

Идентификаторы

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

Рассмотрим правила построения идентификаторов из букв алфавита (в C++ три):

  1. Первым символом идентификатора C++ может быть только буква.
  2. Следующими символами идентификатора могут быть буквы, буквы-цифры и символы подчеркивания.
  3. Длина идентификатора неограниченна, однако обычно только первые 31 символ распознаются компилятором. (фактически же длина зависит от реализации системы программирования).
  1. При использовании подчеркиваний в идентификаторе нужно быть осторожным, поскольку идентификаторы, начинающиеся с подчеркивания могут совпадать (войти в конфликт) с именами "скрытых" системных программ.
  2. Компилятор рассматривает буквы верхнего и нижнего регистров как различные символы.
  3. Компилятор не допускает идентификаторов, которые имеют ту же самую орфографию, что и ключевые слова.

Ключевые слова и имена

Часть идентификаторов 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 inline static void delete int static__cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace template

Символы операций и разделителей

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

Короче символы операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся по количеству участвующих в них операндов на:

  • унарные
  • бинарные
  • тернарную

Один и тот же символ операции может интерпретироваться по-разному в зависимости от контекста. Все знаки операций за исключением [ ], ( ) и ? : представляют собой отдельные лексемы. Большинство стандартных операций может быть переопределено (перегружено).

Символы операций приведены в отдельной заметке – Операции языка C++

Слеующие последовательности специальных символов и букв алфавита образуют множество символов операций (часть из них в зависимости от контекста может быть использована в качестве разделителей):

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

Литералы

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

В C++ существует пять типов литералов:

    1. целочисленный литерал,
    2. вещественный литерал,
    3. логический
    4. символьный литерал,
    5. строковый литерал.

Комментарии

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

Большинство специалистов сходятся во мнении, что комментарии должны объяснять намерения программиста, а не код; то, что можно выразить на языке программирования, не должно выноситься в комментарии — в частности, надо использовать говорящие названия переменных, функций, классов, методов и пр., разбивать программу на лёгкие для понимания части, стремиться к тому, чтобы структура классов и структура баз данных были максимально понятными и прозрачными и т. д. Есть даже мнение (его придерживаются в экстремальном программировании и некоторых других гибких методологиях программирования), что если для понимания программы требуются комментарии — значит, она плохо написана.

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

Комментарии часто используются для временного отключения части кода. В языках C и C++, некоторые рекомендуют использовать с той же целью директивы препроцессора (#if 0 … #endif).

С точки зрения синтаксиса, существуют два вида комментариев.

    Многострочный комментарий может иметь любую длину, он отмечается специальными символами в начале и конце (например, /* */ ).

Пример кода программы с комментариями:

Переменные

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

Все переменные в языке C++ должны быть объявлены перед использованием. При использовании в программе ранее не объявленной переменной компилятор выдаст сообщение об ошибке.

Объявление переменной имеет следующий вид: <тип переменой> <один или несколько идентификаторов переменных через запятую>; Например, переменные x и y типа int(целочисленные) можно объявить такой строкой:

Переменную f типа double(с плавающей точкой двойной точности) можно объявить такой строкой:

Это один из вариантов объявления переменных. В языке С++ объявление может происходить на любом участке программного кода. Мы объявили переменные х, у и определили, что они могут содержать значения типа int.

NB!! Значения переменных сразу после объявления не определены и являются произвольными. Предположение о том, что все переменные первоначально имеют нулевые значения, является ошибочным.

Типы данных

В C++ доступны следующие встроенные типы:

  • Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
  • Целочисленные знаковые: signed char, short int, int, long int (и long long int, в стандарте C++11).
  • Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long int(и unsigned long long int, в стандарте C++11).
  • С плавающей точкой: float, double, long double.
  • Логический: bool, имеющий значения true и false.

Операции сравнения возвращают тип bool. Выражения в скобках после if, while приводятся к типу bool.

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

К целочисленным типам относятся типы, представленные следующими именами основных типов:

Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения. Возможно, что при этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления знака. Если этот бит установлен в 0, то значение переменной считается положительным. Если бит установлен в 1, то значение переменной считается отрицательным.

Модификатор типа unsigned указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти - для представления значения.

В ряде случаев модификаторы типа можно рассматривать как имена основных типов.

Тип Описание Размер Диапазон Синоним int Целые числа 4 байта -2 31 . 2 31 -1 unsigned int Беззнаковые целые 4 байта 0. 2 32 -1 unsigned long int Длинные целые 4 байта -2 31 . 2 31 -1 long unsigned long Беззнаковые длинные 4 байта 0. 2 32 -1 short int Короткие целые 2 байта -2 15 ..2 15 -1 short unsigned short Беззнаковые короткие 2 байта 0. 2 16 -1

При этом в стандарте языка C++ не оговаривается конкретный размер каждого из вышеперечисленных типов, для каждого компилятора они могут быть своими. Приведенные выше числа верны для компиляторов GCC, MS VC++.

Действительные числа или числа с плавающей точкой можно записывать в виде десятичных дробей как с фиксированной точкой (например, 3.1415926, 100.001, -10000000.0), так и с плавающей точкой. В последнем случае число имеет вид <f> e <p>, где <f> — дробное число (положительное или отрицательное), называемое мантиссой, а <p> — целое число (положительное или отрицательное), называемое порядком. Примеры записи чисел с плавающей точкой:

Запись Значение 3.14e1 31.4 3.14e5 314000 3.14e-3 0.00314 -1e6 -1000000

К плавающим типам относятся три типа, представленные следующими именами типов, модификаторов и их сочетаний:

Имя типа Байты Биты Min Max float 4 32 3.4E-38 3.4E+38 double 8 64 1.7E-308 1.7E+308 long double 10 80 3.4E-4932 3.4E+4932

Как правило, для хранения целых чисел следует использовать тип int, а для действительных чисел — double.

NB! Помимо основных типов в C++ существуют специальные языковые средства, которые позволяют из элементов основных типов создавать новые, так называемые производные типы.

Константы

Константами называют неизменяемые величины. Существую константы следующих типов:

  • целые
  • вещественные
  • символьные
  • строковые .

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

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

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

Переменная coder типа int, а число 14 является литеральной константой.

Именованные константы представлены именем, как и все переменные, однако в отличие от переменной, значение инициализированной константы изменить невозможно.

Используя ключевое слово const, тип переменной создаём сонстанту с именем moloko и присваиваем ей значение 30.

Можно также определить константу директивой препроцессора

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

Операции и арифметические операторы

Арифметическая инструкция — это некоторое выражение, состоящее из констант, идентификаторов переменных и арифметических операторов, которая завершается точкой с запятой. Самый главный арифметический оператор — это оператор присваивания ‘=’, который присваивает одной переменной, идентификатор которой указывается слева от оператора ‘=’ значение некоторого выражения, которое стоит справа. Например:

В последней строке встретился оператор сложения ‘+’. Кроме оператора сложения, есть еще операторы вычитания ‘-’, умножения ‘*’, деления ‘/’ и взятия остатка от деления целых чисел ‘%’.

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

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

Стили и нормы программирования

Правила форматирования кода.

Ввод-вывод

Для того, чтобы вывести на экран значение переменной или текстовой строки нужно использовать объект ‘cout’ и оператор ‘<<’, который в данном случае следует называть "Поместить в". cout — объект, связанный со стандартным выводом программы, как правило, это терминал. Для того, чтобы перейти при печати на новую строку необходимо поместить в cout стандартный объект endl.

Текстовые строки при выводе на экран необходимо заключать в двойные кавычки. Если хочется вывести на экран несколько объектов (переменных, текстовых строк и т.д.), то их нужно разделять между собой оператором ‘<<’.

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

Обобщим все изложенное выше в более сложной программе, которая находит сумму двух введенных чисел.