Данный раздел предназначен для облегчения начала изучения C++ теми, кто знает Pascal.
Pascal | C++ | Замечание |
---|---|---|
|
C++ не предоставляет средств для объявления модулей. Модулем считается файл с исходным кодом. Название модуля — название файла. |
|
|
|
Неточное соответствие: строка #include просто заменяется на содержимое указанного файла. |
|
|
|
Составной оператор
|
Блок
|
|
|
|
При запуске программы выполняется функция main. Блоки могут быть только телами функций или располагаться внутри тел функций. “Свободных” блоков нет. |
Строковая константа
|
Строковый литерал
|
Строковые константы заключаются в двойные кавычки. Специальные символы доступны через экранирование обратной косой чертой См. также здесь |
|
|
Файл
Скобки после имени функции нужны даже в том случае, когда функция не принимает параметров. |
|
|
Тип указывается перед именем переменной, параметра или функции. В C++ нельзя указать результат вычисления функции через присваивание. Вместо этого результат указывается как “аргумент” инструкции return , выполнение которой приводит к выходу из тела функции. |
|
|
В C++ нет разделения на “процедуры” и “функции”. Процедуры — это функции, не возвращающие значения. Для указания этого факта используется специальный тип Строки в C++ — отдельная тема.
|
|
|
Секции Значения переменных по умолчанию не определены. |
|
|
Для записи целочисленных констант в двоичной форме используется префикс Для записи целочисленных констант в шестнадцатеричной форме используется префикс Для записи целочисленных констант в восьмиричной форме используется префикс Символьный тип является целочисленным (“байт”). Символьные константы записываются в одинарных кавычек и не считаются строками. |
|
|
Секции const нет. Константность является частью типа и включается в описание типа. |
|
|
Функция sqrt, вычисляющая квадратный корень, объявлена в cmath. Подробнее о вычислениях в плавающей точке см. здесь При определении функции в C++ необходимо указывать тип для каждого параметра функции. |
Оператор ветвления
|
Инструкция if
|
Условие обязательно помещается в скобки. Ключевого слова |
Оператор ветвления — полный
|
Инструкция if-else
|
|
|
|
Можно вкладывать произвольное количество веток else-if. |
|
|
Секции Вызов функции, не принимающей параметров также требует наличия скобок:
|
Выбор варианта
|
Инструкция switch-case
|
Проверяемое значение должно быть заключено в скобки: Принцип действия можно условно описать как В качестве “целей” Переход на метку |
|
|
Присваивание записывается через одно “равно”: Сравнение на равенство записывается через два “равно”: Сравнение на неравенство записывается |
Решение квадратного уравнения
|
|
Передача переменных по ссылке осуществляется с помощью “ссылочного типа” — параметры |
|
|
Инкремент переменной: Декремент переменной: |
|
|
Возведение в степень выполняется с помощью стандартной функции pow , объявленной, как и sqrt , в cmath. |
Возведение в степень
|
Функция возведения в степень
|
Деление нацело также записывается как Операция взятия остатка от деления записывается через |
|
Строго говоря, прямых аналогов данным функциям в C++ нет. Вместо ord обычно можно использовать явное приведение к целочисленному типу (которое можно оформить как int(a) ). |
|
|
Прямых аналогов в C++ нет. Нумерация элементов массивов начинается с нуля, поэтому, если Последний элемент массива имеет индекс на единицу меньший количества элементов в массиве. |
|
|
|
Логическое “или” — || , логическое “и” — && , логическое “не” — ! . “Или” и “и” вычисляются по короткой схеме. |
Битовые операции
|
Битовые операции
|
Операнды — целые числа, интерпретируются этими операциями как последовательности бит. См. также здесь |
Цикл с предусловием
|
Инструкция while
|
Простейший способ организации цикла. Условие после Запись Аналогичные комбинации определены для ряда других бинарных операций: |
Цикл с постусловием
|
Инструкция do-while
|
Инструкция Функция |
Цикл for
|
Инструкция for
|
В C++ Секции внутри Бесконечный цикл:
|
Массив фиксированного размера
|
Статический массив
|
В C++ указывается количество элементов. Нумерация элементов начинается с нуля. Работа с массивами в C++ имеет свою специфику. |
|
|
При обращении к элементу многомерного массива каждый индекс заключается в собственную пару квадратных скобок. |
Объявление синонима типа
|
Объявление синонима типа
|
Секции Конструкция |
Тип-перечисление
|
Тип-перечисление
|
|
Тип-диапазон и тип-множество
|
Прямых аналогов в C++ нет. |
|
Запись
|
Структура
|
После определения структуры обязательно ставится
|
Вариантная запись
|
Объединение
|
Объединение попросту размещает свои поля по одному адресу (в общей памяти). Программист должен сам определять, какое поле объединения используется в данный момент. Вариантная запись с тегом может быть реализована через комбинацию структуры и объединения. На практике не рекомендуется использовать структуры вроде приведённой слева |
Файловый тип
|
Прямых аналогов в C++ нет, однако Стандартная библиотека содержит средства для работы с файлами как с потоками байт. |
|
Указатели
|
Указатели
|
“Нулевой” указатель — Разыменование (обращение по указателю) — унарная операция “звёздочка” |
Указатель на массив (строку)
|
Указатель на массив
|
Статические массивы неявно приводятся к указателям на первый элемент. К самому указателю можно обращаться как к массиву, используя операцию Так как в C++ a — просто массив символов, отсчёт начинается с нуля, а не с единицы как в примере на Pascal (поэтому 49, а не 50). |
Нетипизированный указатель
|
Нетипизированный указатель
|
Указатель на некие данные в памяти, тип которых может быть любым, оформляется как “указатель на Любой указатель неявно приводится к |
Динамическая память
|
Динамическая память
|
С помощью
Оператор
|
Динамический массив
|
Динамический массив
|
Форма |
Процедурный/функциональный тип
|
Указатель на функцию
|
Указатель на функцию позволяет изменять вызываемую функцию во время исполнения программы, передавать функцию как параметр другой функции. |
Предварительное объявление типа
|
Объявление типа
|
В данном примере на C++ нет необходимости в объявлении типа
|
Доступ к полю записи по указателю
|
Доступ к полю структуры по указателю
|
Естественно, данная запись эквивалентна
Но операция |
В отличие от Pascal, присваивание, инкремент и декремент в C++ являются выражениями, поэтому возможен следующий код (присваивание является правоассоциированной операцией: цепочки вычисляются справа-налево):
int a, b, c;
c = b = a = 0; // теперь a == 0, b == 0 и c == 0
a = ++b + ++c; // теперь a == 2, b == 1 и c == 1
a += b += c; // теперь a == 4, а b == 2
Присваивающие операции возвращают свою левую часть по ссылке (т. е. саму переменную, значение которой было изменено):
double x;
int n;
x = n = 1.5; // теперь n = 1 и x = 1
assert(&n == &(n = 2)); // можно взять адрес, адреса совпадут
В Pascal могут существовать процедура и функция с одним и тем же именем, поскольку вызов процедуры — “оператор”, а вызов функции — “выражение”, таким образом, процедуры и функции “существуют в разных мирах” и не пересекаются. В C++ есть только функции и вызов функции — выражение. Впрочем, C++ поддерживает “перегрузку” функций: разные функции могут иметь одно имя в общей области видимости, если принимают разные наборы параметров (количество, тип).
,
и “тернарный оператор” ?:
.
(a = b + c, b = c, c = a)
— записать в a
сумму b + c
, потом скопировать в b
значение c
, потом скопировать в c
значение a
. Всё выражение в скобках будет равно c
(последнему вычисленному выражению из разделённых запятыми).a = b > 0? 1: 2
— выражение справа от равно будет вычислено как 1
, если истинно условие b > 0
и как 2
в противном случае.Числа и указатели неявно приводятся к булевским значениям (нуль → false
, не нуль → true
; nullptr
→ false
, не nullptr
→ true
).
Ряд операций в C++ допускает запись с помощью ключевых слов, однако они не снискали популярности среди программистов:
Операция | Обычная для C++ запись | Альтернативная запись |
---|---|---|
Логическое “и” |
|
|
Логическое “или” |
|
|
Логическое “не” |
|
|
Побитовое “и” |
|
|
Побитовое “или” |
|
|
Побитовое “исключающее или” |
|
|
Побитовое “не” |
|
|
Побитовое “и” с присваиванием |
|
|
Побитовое “или” с присваиванием |
|
|
Побитовое “исключающее или” с присваиванием |
|
|
Не равно |
|
|
Инструкции if
, switch
, while
позволяют определять переменную непосредственно в условии, значение которой будет использовано данной инструкцией, а сама переменная будет локальной переменной блока, принадлежащего данной инструкции:
while (Link *link = get_next_link())
cout << link->data;
Инструкция for
позволяет вводить сразу несколько переменных одного типа, которые будут доступны внутри блока for:
for (int f1 = 0, f2 = 1, s; f1 < 1000; s = f1 + f2, f1 = f2, f2 = s)
cout << f1 << ", ";
Если переменная инициализируется некоторым значением, то вместо конкретного типа переменной можно поставить ключевое слово auto
, тогда компилятор назначит переменной тип в соответствии с типом инициализирующего значения.
auto x = 1.0; // x имеет тип double, потому что 1.0 имеет тип double
auto p = &x; // p имеет тип double*, потому что &x имеет тип double*
О строках и потоках ввода-вывода (файлах), предоставляемых Стандартной библиотекой C++ более подробно рассказано в Строки и потоки ввода-вывода C++.
Раздел Память I посвящён организации данных в памяти и средствам управления динамической памятью. Также о массивах см. соответствующий раздел. Стандартная библиотека C++ предоставляет “класс-шаблон” vector<T>
, реализующий работу с динамическими массивами в удобной форме, см. в задании 9.
Вычислениям с плавающей точкой и “математическим функциям” в составе Стандартной библиотеки C++ (cmath
) посвящён раздел Числа с плавающей запятой.
Кувшинов Д.Р. © 2016