Данный раздел предназначен для облегчения начала изучения 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