С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 15
Текст из файла (страница 15)
В последующих главах мы разберем этивопросы более подробно и систематично.Упражнение 2.22string pals[] = {"pooh", "tiger", "piglet", "eeyore", "kanga" };(a)(b)(c)(d)(e)vector<string>vector<int>vector<int>vector<string>vector<double>svec1(pals,pals+5);ivec1(10);ivec2(10,10);svec2(svec1);dvec;Поясните результаты каждого из следующих определений вектора:Упражнение 2.23Напишите две реализации функции min(), объявление которой приведено ниже.Функция должна возвращать минимальный элемент массива.
Используйте цикл for иперебор элементов с помощьюиндексаtemplate <class elemType>итератораelemType min (const vector<elemType> &vec);С++ для начинающихЧасть IIОсновы языкаКод программы и данные, которыми программа манипулирует, записываются в памятькомпьютера в виде последовательности битов. Бит – это мельчайший элементкомпьютерной памяти, способная хранить либо 0, либо 1. На физическом уровне этосоответствует электрическому напряжению, которое, как известно, либо есть , либо нет.Посмотрев на содержимое памяти компьютера, мы увидим что-нибудь вроде:00011011011100010110010000111011 ...Очень трудно придать такой последовательности смысл, но иногда нам приходитсяманипулировать и подобными неструктурированными данными (обычно нужда в этомвозникает при программировании драйверов аппаратных устройств).
С++ предоставляетнабор операций для работы с битовыми данными. (Мы поговорим об этом в главе 4.)Как правило, на последовательность битов накладывают какую-либо структуру,группируя биты в байты и слова. Байт содержит 8 бит, а слово – 4 байта, или 32 бита.Однако определение слова может быть разным в разных операционных системах. Сейчасначинается переход к 64-битным системам, а еще недавно были распространены системыс 16-битными словами. Хотя в подавляющем большинстве систем размер байта одинаков,мы все равно будем называть эти величины машинно-зависимыми.Так выглядит наша последовательность битов, организованная в байты.Рис 1.Адресуемая машинная памятьТеперь мы можем говорить, например, о байте с адресом 1040 или о слове с адресом 1024и утверждать, что байт с адресом 1032 не равен байту с адресом 1040.Однако мы не знаем, что же представляет собой какой-либо байт, какое-либо машинноеслово.
Как понять смысл тех или иных 8 бит? Для того чтобы однозначноинтерпретировать значение этого байта (или слова, или другого набора битов), мыдолжны знать тип данных, представляемых данным байтом.С++ предоставляет набор встроенных типов данных: символьный, целый,вещественный – и набор составных и расширенных типов: строки, массивы, комплексныечисла. Кроме того, для действий с этими данными имеется базовый наборопераций: сравнение, арифметические и другие операции. Есть также операторыпереходов, циклов, условные операторы. Эти элементы языка С++ составляют тот наборкирпичиков, из которых можно построить систему любой сложности.
Первым шагом восвоении С++ станет изучение перечисленных базовых элементов, чему и посвященачасть II данной книги.Глава 3 содержит обзор встроенных и расширенных типов, а также механизмов, спомощью которых можно создавать новые типы. В основном это, конечно, механизмклассов, представленный в разделе 2.3. В главе 4 рассматриваются выражения,встроенные операции и их приоритеты, преобразования типов.
В главе 5 рассказываетсяоб инструкциях языка. И наконец глава 6 представляет стандартную библиотеку С++ иконтейнерные типы – вектор и ассоциативный массив.74С++ для начинающих753. Типы данных С++В этой главе приводится обзор встроенных, или элементарных, типов данныхязыка С++. Она начинается с определения литералов, таких, как 3.14159 или pi, азатем вводится понятие переменной, или объекта, который должен принадлежать кодному из типов данных.
Оставшаяся часть главы посвящена подробномуописанию каждого встроенного типа. Кроме того, приводятся производные типыданных для строк и массивов, предоставляемые стандартной библиотекой С++.Хотя эти типы не являются элементарными, они очень важны для написаниянастоящих программ на С++, и нам хочется познакомить с ними читателя какможно раньше. Мы будем называть такие типы данных расширением базовыхтипов С++.3.1. ЛитералыВ С++ имеется набор встроенных типов данных для представления целых ивещественных чисел, символов, а также тип данных “символьный массив”, которыйслужит для хранения символьных строк. Тип char служит для хранения отдельныхсимволов и небольших целых чисел.
Он занимает один машинный байт. Типы short,int и long предназначены для представления целых чисел. Эти типы различаютсятолько диапазоном значений, которые могут принимать числа, а конкретные размерыперечисленных типов зависят от реализации. Обычно short занимает половинумашинного слова, int – одно слово, long – одно или два слова. В 32-битных системахint и long, как правило, одного размера.Типы float, double и long double предназначены для чисел с плавающей точкой иразличаются точностью представления (количеством значащих разрядов) и диапазоном.Обычно float (одинарная точность) занимает одно машинное слово, double (двойнаяточность) – два, а long double (расширенная точность) – три.char, short, int и long вместе составляют целые типы, которые, в свою очередь, могутбыть знаковыми (signed) и беззнаковыми (unsigned).
В знаковых типах самый левыйбит служит для хранения знака (0 – плюс, 1 – минус), а оставшиеся биты содержатзначение. В беззнаковых типах все биты используются для значения. 8-битовый типsigned char может представлять значения от -128 до 127, а unsigned char – от 0 до255.Когда в программе встречается некоторое число, например 1, то это число называетсялитералом, или литеральной константой. Константой, потому что мы не можемизменить его значение, и литералом, потому что его значение фигурирует в текстепрограммы.
Литерал является неадресуемой величиной: хотя реально он, конечно,хранится в памяти машины, нет никакого способа узнать его адрес. Каждый литералимеет определенный тип. Так, 0 имеет тип int, 3.14159 – тип double.Литералы целых типов можно записать в десятичном, восьмеричном ишестнадцатеричном виде. Вот как выглядит число 20, представленное десятичным,восьмеричным и шестнадцатеричным литералами:20// десятичный024// восьмеричный0х14 // шестнадцатеричныйС++ для начинающих76Если литерал начинается с 0, он трактуется как восьмеричный, если с 0х или 0Х, то какшестнадцатеричный. Привычная запись рассматривается как десятичное число.По умолчанию все целые литералы имеют тип signed int.
Можно явно определитьцелый литерал как имеющий тип long, приписав в конце числа букву L (используется какпрописная L, так и строчная l, однако для удобства чтения не следует употреблятьстрочную: ее легко перепутать с 1). Буква U (или u) в конце определяет литерал какunsigned int, а две буквы – UL или LU – как тип unsigned long. Например:128u1024UL1L8LuЛитералы, представляющие действительные числа, могут быть записаны как сдесятичной точкой, так и в научной (экспоненциальной) нотации. По умолчанию ониимеют тип double. Для явного указания типа float нужно использовать суффикс F илиf, а для long double - L или l, но только в случае записи с десятичной точкой.Например:3.14159F 0/1f12.345L 0.03el1.0E-3E 2.1.0LСлова true и false являются литералами типа bool.Представимые литеральные символьные константы записываются как символы водинарных кавычках. Например:'a''2'','' ' (пробел)Специальные символы (табуляция, возврат каретки) записываются как escapeпоследовательности .
Определены следующие такие последовательности (они начинаютсяс символа обратной косой черты):новая строкагоризонтальная табуляциязабойвертикальная табуляциявозврат кареткипрогон листазвонокобратная косая чертавопросодиночная кавычкадвойная кавычка\n\t\b\v\r\f\a\\\?\'\"escape-последовательность общего вида имеет форму \ooo, где ooo – от одной до трехвосьмеричных цифр.
Это число является кодом символа. Используя ASCII-код, мы можемнаписать следующие литералы:\7 (звонок)\0 (null)\14 (новая строка)\062 ('2')С++ для начинающихСимвольный литерал может иметь префикс L (например, L'a'), что означаетспециальный тип wchar_t – двухбайтовый символьный тип, который применяется дляхранения символов национальных алфавитов, если они не могут быть представленыобычным типом char, как, например, китайские или японские буквы.Строковый литерал – строка символов, заключенная в двойные кавычки.
Такой литералможет занимать и несколько строк, в этом случае в конце строки ставится обратная косаячерта. Специальные символы могут быть представлены своими escapeпоследовательностями. Вот примеры строковых литералов:"" (пустая строка)"a""\nCC\toptions\tfile.[cC]\n""a multi-line \string literal signals its \continuation with a backslash"Фактически строковый литерал представляет собой массив символьных констант, где посоглашению языков С и С++ последним элементом всегда является специальный символс кодом 0 (\0).Литерал 'A' задает единственный символ А, а строковый литерал "А" – массив из двухэлементов: 'А' и \0 (пустого символа).Раз существует тип wchar_t, существуют и литералы этого типа, обозначаемые, как и вслучае с отдельными символами, префиксом L:L"a wide string literal"Строковый литерал типа wchar_t – это массив символов того же типа, завершенныйнулем.Если в тесте программы идут подряд два или несколько строковых литералов (типа charили wchar_t), компилятор соединяет их в одну строку.
Например, следующий текст"two" "some"породит массив из восьми символов – twosome и завершающий нулевой символ.// this is not a good ideaРезультат конкатенации строк разного типа не определен. Если написать:"two" L"some"то на каком-то компьютере результатом будет некоторая осмысленная строка, а на другомможет оказаться нечто совсем иное.