Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Аргументы функции main() могут зависеть от реализации, но любая реализация должна допускать два варианта (но только одну для конкретной программы).
int main(); // без аргументов
int main(int argc, char* argv[]); // массив argv[] содержит
// argc C-строк
В определении функции main() явно указывать тип возвращаемого значения не обязательно. В таком случае программа, дойдя до конца, вернет нуль. Вот как выглядит минимальная программа на языке C++:
int main() { }
Если вы определили глобальный (в пространстве имен) объект, имеющий конструктор и деструктор, то вполне логично, чтобы конструктор выполнялся до функции main(), а деструктор — после функции main(). Формально говоря, выполнение таких конструкторов является частью вызова функции main(), а выполнение деструкторов — частью возвращения из функции main(). При малейшей возможности постарайтесь избегать глобальных объектов, особенно если они требуют нетривиального создания и уничтожения.
A.1.3. Комментарии
Все, что можно сказать в программе, должно быть сказано. Однако в языке C++ есть два стиля комментариев, позволяющие программистам сказать то, что невозможно выразить с помощью кода.
// это однострочный комментарий
/*
это многострочный
блок комментариев
*/
Очевидно, что блоки комментариев чаще всего оформляются как многострочные комментарии, хотя некоторые люди предпочитают разделять их на несколько однострочных.
// Это многострочный
// комментарий,
// представленный в виде трех однострочных комментариев,
/* а это однострочный комментарий, представленный как блочный
комментарий */
Комментарии играют важную роль для документирования предназначения кода; см. также раздел 7.6.4.
A.2. Литералы
Литералы представляют значения разных типов. Например, литерал 12 представляет целое число двенадцать, литерал "Morning" — символьную строку Morning, а литерал true — булево значение true.
A.2.1. Целочисленные литералы
Целочисленные литералы (integer literals) имеют три разновидности.
• Десятичные: последовательности десятичных цифр.
Десятичные цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9.
• Восьмеричные: последовательности восьмеричных цифр, начинающиеся с нуля.
Восьмеричные цифры: 0, 1, 2, 3, 4, 5, 6 и 7.
• Шестнадцатеричные: последовательности шестнадцатеричных цифр, начинающихся с 0x или 0X.
Шестнадцатеричные цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, A, B, C, D, E и F.
Суффикс u или U означает, что целочисленный литерал не имеет знака, т.е. имеет спецификатор unsigned (см. раздел 25.5.3), а суффикс l или L относит их к типу long, например 10u или 123456UL.
A.2.1.1. Числовые системы
Обычно мы записываем числа в десятичной системе. Число 123 означает 1 сотню плюс 2 десятки плюс 3 единицы, или 1*100+2*10+3*1, или (используя символ ^ для обозначения степени) 1*10^2+2*10^1+3*10^0. Иногда вместо слова десятичный говорят: “База счисления равна десяти” (base-10). В данном случае число 10 означает, что в выражении 1*base^2+2*base^1+3*base^0 выполняется условие base==10. Существует много теорий, объясняющих, почему мы используем десятичную систему счисления. Одна из них апеллирует к естественным языкам: у нас на руках десять пальцев, а каждый символ, такой как 0, 1 и 2, представляющий собой цифру в позиционной системе счисления, в английском языке называется digit. Слово Digit в латинском языке означает палец.
Впрочем, иногда используются и другие системы счисления. Как правило, положительные целые числа в памяти компьютера представляются в двоичной системе счисления, т.е. база счисления равна 2 (значения 0 и 1 относительно легко представить с помощью физических состояний). Люди, сталкивающиеся с необходимостью решать задачи на низком уровне аппаратного обеспечения, иногда используют восьмеричную систему счисления (база равна 8), а при адресации памяти чаще используется шестнадцатеричная система (база равна 16).
Рассмотрим шестнадцатеричную систему счисления. Мы должны назвать шестнадцать значений от 0 до 15. Обычно для этого используются следующие символы: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, где A имеет десятичное значение 10, B — десятичное значение 11 и так далее:
A==10, B==11, C==12, D==13, E==14, F==15
Теперь можем записать десятичное число 123 как 7B в шестнадцатеричной системе счисления. Для того чтобы убедиться в этом, обратите внимание на то, что в шестнадцатеричной системе счисления число 7B равно 7*16+11, что в десятичной системе счисления равно 123. И наоборот, шестнадцатеричное число 123 означает 1*16^2+2*16+3, т.е. 1*256+2*16+3, что в десятичной системе счисления равно 291. Если вы никогда не сталкивались с недесятичными представлениями целых чисел, то мы настоятельно рекомендуем вам поупражняться в преобразовании чисел из десятичной системы в шестнадцатеричную, и наоборот. Обратите внимание на то, что шестнадцатеричная цифра имеет очень простое соответствие со своим двоичным значением.
Это объясняет популярность шестнадцатеричной системы. В частности, значение байта просто выражается двумя шестнадцатеричными цифрами.
В языке C++ (к счастью) числа являются десятичными, если иное не указано явно. Для того чтобы сказать, что число является шестнадцатеричным, следует поставить префикс 0X (символ X происходит от слова hex), так что 123==0X7B и 0X123==291. Точно так же можно использовать символ x в нижнем регистре, поэтому 123==0x7B и 0x123==291. Аналогично мы можем использовать шестнадцатеричные цифры a, b, c, d, e и f в нижнем регистре. Например, 123==0x7b.
Восьмеричная система основана на базе счисления, равной восьми. В этом случае мы можем использовать только восемь восьмеричных цифр: 0, 1, 2, 3, 4, 5, 6, 7. В языке C++ числа в восьмеричной системе счисления начинаются с символа 0, так что число 0123 —