Шестнадцатеричные и восьмеричные литералы



 

Иногда удобно вместо десятичной системы счисления использовать восьмеричную или шестнадцатеричную. В восьмеричной системе основанием служит число 8, а для выражения всех чисел используются цифры от 0 до 7. В восьмеричной системе число 10 имеет то же значение, что число 8 в десятичной. Система счисления по основанию 16 называется шестнадцатеричной и использует цифры от 0 до 9 плюс буквы от А до F, означающие шестнадцатеричные "цифры" 10, 11, 12, 13, 14 и 15. Например, шестнадцатеричное число 10 равно числу 16 в десятичной системе. Поскольку эти две системы счисления (шестнадцатеричная и восьмеричная) используются в программах довольно часто, в языке C++ разрешено при желании задавать целочисленные литералы не в десятичной, а в шестнадцатеричной или восьмеричной системе. Шестнадцатеричный литерал должен начинаться с префикса 0x (нуль и буква х) или , а восьмеричный – с нуля. Приведем два примера.

 

Строковые литералы

 

Язык C++ поддерживает еще один встроенный тип литерала, именуемый строковым . Строка – это набор символов, заключенных в двойные кавычки, например "это тест" . Вы уже видели примеры строк в некоторых cout‑инструкциях, с помощью которых мы выводили текст на экран. При этом обратите внимание вот на что. Хотя C++ позволяет определять строковые литералы, он не имеет встроенного строкового типа данных. Строки в C++, как будет показано ниже в этой книге, поддерживаются в виде символьных массивов. (Кроме того, стандарт C++ поддерживает строковый тип с помощью библиотечного класса string , который также описан ниже в этой книге.)

Осторожно! Не следует путать строки с символами. Символьный литерал заключается в одинарные кавычки, например 'а'. Однако "а" – это уже строка, содержащая только одну букву.

 

Управляющие символьные последовательности

 

С выводом большинства печатаемых символов прекрасно справляются символьные константы, заключенные в одинарные кавычки, но есть такие "экземпляры" (например, символ возврата каретки), которые невозможно ввести в исходный текст программы с клавиатуры. Некоторые символы (например, одинарные и двойные кавычки) в C++ имеют специальное назначение, поэтому иногда их нельзя ввести напрямую. По этой причине в языке C++ разрешено использовать ряд специальных символьных последовательностей (включающих символ "обратная косая черта"), которые также называются управляющими последовательностями . Их список приведен в табл. 3.4.

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

 

 

 

Инициализация переменных

 

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

 

 

Вот несколько примеров.

 

 

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

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

Рассмотрим простой пример инициализации переменных. В следующей программе используется функция total() , которая предназначена для вычисления суммы всех последовательных чисел, начиная с единицы и заканчивая числом, переданным ей в качестве аргумента. Например, сумма ряда чисел, ограниченного числом 3 , равна 1 + 2 + 3 = 6 . В процессе вычисления итоговой суммы функция total() отображает промежуточные результаты. Обратите внимание на использование переменной sum в функции total() .

 

 

Результаты выполнения этой программы таковы.

 

 

Как видно по результатам, при каждом вызове функции total() переменная sum инициализируется нулем.

 

Операторы

 

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

 

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

 

В табл. 3.5 перечислены арифметические операторы, разрешенные для применения в C++. Действие операторов + , ‑, * и / совпадает с действием аналогичных операторов в любом другом языке программирования (да и в алгебре, если уж на то пошло). Их можно применять к данным любого встроенного числового типа. После применения оператора деления (/ ) к целому числу остаток будет отброшен. Например, результат целочисленного деления 10/3 будет равен 3 .

 

 

Остаток от деления можно получить с помощью оператора деления по модулю (% ). Этот оператор работает практически так же, как в других языках программирования: возвращает остаток от деления нацело. Например, 10%3 равно 1 . Это означает, что в C++ оператор "%" нельзя применять к типам с плавающей точкой (float или double). Деление по модулю применимо только к целочисленным типам. Использование этого оператора демонстрируется в следующей программе.

 

 

В последней строке результатов выполнения этой программы действительно будут выведены числа 0 и 1 , поскольку при целочисленном делении 1/2 получим 0 с остатком 1 , т.е. выражение 1%2 дает значение 1 .

Унарный минус, по сути, представляет собой умножение значения своего единственного операнда на ‑1 . Другими словами, любое числовое значение, которому предшествует знак меняет свой знак на противоположный.

 

Инкремент и декремент

 

В C++ есть два оператора, которых нет в некоторых других языках программирования. Это операторы инкремента (++ ) и декремента (‑‑ ). Они упоминались в главе 2, когда речь шла о цикле for. Оператор инкремента выполняет сложение операнда с числом 1, а оператор декремента вычитает 1 из своего операнда. Это значит, что инструкция

 

 

аналогична такой инструкции:

 

 

А инструкция

 

 

аналогична такой инструкции:

 

 

Операторы инкремента и декремента могут стоять как перед своим операндом (префиксная форма ), так и после него (постфиксная форма ). Например, инструкцию

 

 

можно переписать в виде префиксной формы

 

 

или в виде постфиксной формы:

 

 

В предыдущем примере не имело значения, в какой форме был применен оператор инкремента: префиксной или постфиксной. Но если оператор инкремента или декремента используется как часть большего выражения, то форма его применения очень важна. Если такой оператор применен в префиксной форме, то C++ сначала выполнит эту операцию, чтобы операнд получил новое значение, которое затем будет использовано остальной частью выражения. Если же оператор применен в постфиксной форме, то C++ использует в выражении его старое значение, а затем выполнит операцию, в результате которой операнд обретет новое значение. Рассмотрим следующий фрагмент кода:

 

 

В этом случае переменная у будет установлена равной 11 . Но если в этом коде префиксную форму записи заменить постфиксной, переменная у будет установлена равной 10 :

 

 

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

Большинство С++‑компиляторов для операций инкремента и декремента создают более эффективный код по сравнению с кодом, сгенерированным при использовании обычного оператора сложения и вычитания единицы. Поэтому профессионалы предпочитают использовать (где это возможно) операторы инкремента и декремента.

Арифметические операторы подчиняются следующему порядку выполнения действий.

 

 

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

 

История происхождения имени C++

 

Теперь, когда вам стало понятно значение оператора "++" , можно сделать предположения насчет происхождения имени C++. Как вы знаете, C++ построен на фундаменте языка С, к которому добавлено множество усовершенствований, большинство из которых предназначены для поддержки объектно‑ориентированного программирования. Таким образом, C++ представляет собой инкрементное усовершенствование языка С, а результат добавления символов "++" (оператора инкремента) к имени С оказался вполне подходящим именем для нового языка.

Бьерн Страуструп сначала назвал свой язык "С с классами" (С with Classes), но, по предложению Рика Маскитти (Rick Mascitti), он позже изменил это название на C++. И хотя успех нового языка еще только предполагался, принятие нового названия (C++) практически гарантировало ему видное место в истории, поскольку это имя было узнаваемым для каждого С‑программиста.

 


Дата добавления: 2018-09-22; просмотров: 517; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!