Какие из простых типов данных можно выводить на экран используя поток вывода с
Каждая переменная имеет определенный тип. И этот тип определяет, какие значения может иметь переменная, какие операции с ней можно производить и сколько байт в памяти она будет занимать. В языке C++ определены следующие базовые типы данных: логический тип bool , целочисленные типы, типа чисел с плавающей точкой, символьные типы. Рассмотрим эти группы по отдельности.
Логический тип
Логический тип bool может хранить одно из двух значений: true (истинно, верно) и false (неверно, ложно). Например, определим пару переменных данного типа и выведем их значения на консоль:
#include int main() < bool isAlive ; bool isDead ; std::cout
При выводе значения типа bool преобразуются в 1 (если true) и 0 (если false). Как правило, данный тип применяется преимущество в условных выражениях, которые будут далее рассмотрены.
Значение по умолчанию для переменных этого типа — false .
Целочисленные типы
Целые числа в языке C++ представлены следующими типами:
- signed char : представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от -128 до 127
- unsigned char : представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от 0 до 255
- char : представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255 Несмотря на то, что данный тип представляет тот же диапазон значений, что и вышеописанный тип signed char , но они не эквивалентны. Тип char предназначен для хранения числового кода символа и в реальности может представлять как signed byte , так и unsigned byte в зависимости от конкретного компилятора.
- short : представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит). Данный тип также имеет псевдонимы short int , signed short int , signed short .
- unsigned short : представляет целое число в диапазоне от 0 до 65535. Занимает в памяти 2 байта (16 бит). Данный тип также имеет синоним unsigned short int .
- int : представляет целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита). Диапазон предельных значений соответственно также может варьироваться от –32768 до 32767 (при 2 байтах) или от −2 147 483 648 до 2 147 483 647 (при 4 байтах). Но в любом случае размер должен быть больше или равен размеру типа short и меньше или равен размеру типа long Данный тип имеет псевдонимы signed int и signed .
- unsigned int : представляет положительное целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита), и из-за этого диапазон предельных значений может меняться: от 0 до 65535 (для 2 байт), либо от 0 до 4 294 967 295 (для 4 байт). Имеет псевдоним unsigned
- long : в зависимости от архитектуры может занимать 4 или 8 байт и представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647 (при 4 байтах) или от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 (при 8 байтах). Занимает в памяти 4 байта (32 бита) или. Имеет псевдонимы long int , signed long int и signed long
- unsigned long : представляет целое число в диапазоне от 0 до 4 294 967 295. Занимает в памяти 4 байта (32 бита). Имеет синоним unsigned long int .
- long long : представляет целое число в диапазоне от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807. Занимает в памяти 8 байт (64 бита). Имеет псевдонимы long long int , signed long long int и signed long long .
- unsigned long long : представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита). Имеет псевдоним unsigned long long int .
Для представления чисел в С++ применятся целочисленные литералы со знаком или без, типа -10 или 10. Например, определим ряд переменных целочисленных типов и выведем их значения на консоль:
#include int main() < signed char num1< -64 >; unsigned char num2< 64 >; short num3< -88 >; unsigned short num4< 88 >; int num5< -1024 >; unsigned int num6< 1024 >; long num7< -2048 >; unsigned long num8< 2048 >; long long num9< -4096 >; unsigned long long num10< 4096 >; std::cout u или U. Литералы типовlongиlong longимеют суффиксы L/l и LL/ll соответственно:#include int main() < unsigned int num6< 1024U >; // U - unsigned int long num7< -2048L >; // L - long unsigned long num8< 2048UL >; // UL - unsigned long long long num9< -4096LL >; // LL - long long unsigned long long num10< 4096ULL >;// ULL - unsigned long long std::cout #include int main() < int num< 1'234'567'890 >; std::coutРазличные системы исчисления
По умолчанию все стандартные целочисленные литералы представляют числа в привычной нам десятичной системе. Однако C++ также позволяет использовать и числа в других системах исчисления.
Чтобы указать, что число - шестнадцатеричное, перед числом указывается префикс 0x или 0X . Например:
int num1< 0x1A>; // 26 - в десятичной int num2< 0xFF >; // 255 - в десятичной int num3< 0xFFFFFF >; //16777215 - в десятичнойЧтобы указать, что число - восьмеричное, перед числом указывается ноль 0 . Например:
int num1< 034>; // 26 - в десятичной int num2< 0377 >; // 255 - в десятичнойБинарные литералы предваряются префиксом 0b или 0B :
int num1< 0b11010>; // 26 - в десятичной int num2< 0b11111111 >; // 255 - в десятичнойВсе эти типы литералов также поддерживают суффиксы U/L/LL :
unsigned int num1< 0b11010U>; // 26 - в десятичной long num2< 0377L >; // 255 - в десятичной unsigned long num3< 0xFFFFFFULL >; //16777215 - в десятичнойЧисла с плавающей точкой
Для хранения дробных чисел в C++ применяются числа с плавающей точкой. Число с плавающей точкой состоит из двух частей: мантиссы и показателя степени . Оба могут быть как положительными, так и отрицательными. Величина числа – это мантисса, умноженная на десять в степени экспоненты.
Например, число 365 может быть записано в виде числа с плавающей точкой следующим образом:
3.650000E02В качестве разделителя целой и дробной частей используется символ точки. Мантисса здесь имеет семь десятичных цифр - 3.650000 , показатель степени - две цифры 02 . Буква E означает экспоненту, после нее указывается показатель степени (степени десяти), на которую умножается часть 3.650000 (мантисса), чтобы получить требуемое значение. То есть, чтобы вернуться к обычному десятичному представлению, нужно выполнить следующую операцию:
3.650000 × 102 = 365Другой пример - возьмем небольшое число:
-3.650000E-03В данном случае мы имеем дело с числом –3.65 × 10 -3 , что равно –0.00365 . Здесь мы видим, что в зависимости от значения показателя степени десятичная точка "плавает". Собственно поэтому их и называют числами с плавающей точкой.
Однако хотя такая запись позволяет определить очень большой диапазон чисел, не все эти числа могут быть представлены с полной точностью; числа с плавающей запятой в целом являются приблизительными представления точного числа. Например, число 1254311179 выглядело бы так: 1.254311E09 . Однако если перейти к десятичной записи, то это будет 1254311000 . А это не то же самое, что и 1254311179 , поскольку мы потеряли три младших разряда.
В языке C++ есть три типа для представления чисел с плавающей точкой:
- float : представляет вещественное число одинарной точности с плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти занимает 4 байта (32 бита)
- double : представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В памяти занимает 8 байт (64 бита)
- long double : представляет вещественное число двойной точности с плавающей точкой не менее 8 байт (64 бит). В зависимости от размера занимаемой памяти может отличаться диапазон допустимых значений.
В своем внутреннем бинарном представлении каждое число с плавающей запятой состоит из одного бита знака, за которым следует фиксированное количество битов для показателя степени и набор битов для хранения мантиссы. В числах float 1 бит предназначен для хранения знака, 8 бит для экспоненты и 23 для мантиссы, что в сумме дает 32 бита. Мантисса позволяет определить точность числа в виде 7 десятичных знаков.
В числах double : 1 знаковый бит, 11 бит для экспоненты и 52 бит для мантиссы, то есть в сумме 64 бита. 52-разрядная мантисса позволяет определить точность до 16 десятичных знаков.
Для типа long double расклад зависит от конкретного компилятора и реализации этого типа данных. Большинство компиляторов предоставляют точность до 18 - 19 десятичных знаков (64-битная мантисса), в других же (как например, в Microsoft Visual C++) long double аналогичен типу double .
В C++ литералы чисел с плавающими точками представлены дробными числами, которые в качестве разделителя целой и дробной частей применяют точку:
double num ;
Даже если переменной присваивается целое число, чтобы показать, что мы присваиваем число с плавающей точкой, применяется точка:
double num1< 1 >; // 1 - целочисленный литерал double num2< 1. >; //1. - литерал числа с плавающей точкой
Так, здесь число 1. представляет литерал числа с плавающей точкой, и в принципе аналогичен 1.0 .
По умолчанию все такие числа с точкой расцениваются как числа типа double. Чтобы показать, что число представляет другой тип, для float применяется суффикс f / F , а для long double - l / L :
float num1< 10.56f >; // float long double num2< 10.56l >; // long double
В качестве альтернативы также можно применять экспоненциальную запись:
double num1< 5E3 >; // 5E3 = 5000.0 double num2< 2.5e-3 >; // 2.5e-3 = 0.0025
Размеры типов данных
При перечислении типов данных указывался размер, который он занимает в памяти. Но стандарт языка устанавливает лишь минимальные значения, которые должны быть. Например, для типов int и short минимальное значение - 16 бит, для типа long - 32 бита, для типа long double - 64 разряда. При этом размер типа long должен быть не меньше размера типа int, а размер типа int - не меньше размера типа short, а размер типа long double должен быть не меньше double . А разработчики компиляторов могут выбирать предельные размеры для типов самостоятельно, исходя из аппаратных возможностей компьютера.
К примеру, компилятор g++ Windows для long double использует 16 байт. А компилятор в Visual Studio, который также работает под Windows, и clang++ под Windows для long double используют 8 байт. То есть даже в рамках одной платформы разные компиляторы могут по разному подходить к размерам некоторых типов данных. Но в целом используются те размеры, которые указаны выше при описании типов данных.
Однако бывают ситуации, когда необходимо точно знать размер определенного типа. И для этого в С++ есть оператор sizeof() , который возвращает размер памяти в байтах, которую занимает переменная:
#include int main() < long double number ; std::coutsizeof(number) = 16Символьные типы
В C++ есть следующие символьные типы данных:
- char : представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255
- wchar_t : представляет расширенный символ. На Windows занимает в памяти 2 байта (16 бит), на Linux - 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)
- char8_t : представляет один символ в кодировке Unicode. Занимает в памяти 1 байт. Может хранить любой значение из диапазона от 0 до 256
- char16_t : представляет один символ в кодировке Unicode. Занимает в памяти 2 байта (16 бит). Может хранить любой значение из диапазона от 0 до 65 535
- char32_t : представляет один символ в кодировке Unicode. Занимает в памяти 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 4 294 967 295
char
Переменная типа char хранит числовой код одного символа и занимает один байт. Стандарт языка С++ не определяет кодировку символов, которая будет использоваться для символов char, поэтому производители компиляторов могут выбирать любую кодировку, но обычно это ASCII.
В качестве значения переменная типа char может принимать один символ в одинарных кавычках, либо числовой код символа:
#include int main() < char a1 ; char a2 ; std::cout
В данном случае переменные a1 и a2 будут иметь одно и то же значение, так как 65 - это числовой код символа "A" в таблице ASCII. При выводе на консоль с помощью cout по умолчанию отображается символ.
Кроме того, в C++ можно использовать специальные управляющие последовательности, которые предваряются слешем и которые интерпретируются особым образом. Например, "\n" представляет перевод строки, а "\t" - табуляцию.
Однако ASCII обычно подходит для наборов символов языков, которые используют латиницу. Но если необходимо работать с символами для нескольких языков одновременно или с символами языков, отличных от английского, 256-символьных кодов может быть недостаточно. И в этом случае применяется Unicode .
Unicode (Юникод) — это стандарт, который определяет набор символов и их кодовых точек, а также несколько различных кодировок для этих кодовых точек. Наиболее часто используемые кодировки: UTF-8, UTF-16 и UTF-32. Разница между ними заключается в том, как представлена кодовая точка символа; числовое же значение кода для любого символа остается одним и тем же в любой из кодировок. Основные отличия:
- UTF-8 представляет символ как последовательность переменной длины от одного до четырех байт. Набор символов ASCII появляется в UTF-8 как однобайтовые коды, которые имеют те же значения кодов, что и в ASCII. UTF-8 на сегодняшний день является самой популярной кодировкой Unicode.
- UTF-16 представляет символы как одно или два 16-битных значения.
- UTF-32 представляет все символы как 32-битные значения
В C++ есть четыре типа для хранения символов Unicode: wchar_t , char8_t , char16_t и char32_t ( char16_t и char32_t были добавлены в C+11, а char8_t - в C++20).
wchar_t
Тип wchar_t — это основной тип, предназначенный для наборов символов, размер которых выходит за пределы одного байта. Собственно отсюда и его название: wchar_t - wide (широкий) char. происходит от широкого символа, потому что этот символ «шире», чем обычный однобайтовый символ. Значения wchar_t определяются также как и символы char за тем исключением, что они предваряются символов "L":
wchar_t a1 ;
Также можно передать код символа
wchar_t a1 ;
Значение, заключенное в одинарные кавычки, представляет собой шестнадцатеричный код символа. Обратная косая черта указывает на начало управляющей последовательности, а x после обратной косой черты означает, что код шестнадцатеричный.
Стоит учитывать, что для вывода на консоль символов wchar_t следует использовать не std::cout , а поток std::wcout :
#include int main() < char h = 'H'; wchar_t i ; std::wcout
При этом поток std::wcout может работать как с char, так и с wchar_t. А поток std::cout для переменной wchar_t вместо символа будет выводить его числовой код.
Проблема с типом wchar_t заключается в том, что его размер сильно зависит от реализации и применяемой кодировки. Кодировка обычно соответствует предпочтительной кодировке целевой платформы. Так, для Windows wchar_t обычно имеет ширину 16 бит и кодируется с помощью UTF-16. Большинство других платформ устанавливают размер в 32 бита, а в качестве кодировки применяют UTF-32. С одной стороны, это позволяет больше соответствовать конкретной платформе. Но с другой стороны, затрудняет написание кода, переносимого на разные платформы. Поэтому в общем случае часто рекомендуется использовать типы char8_t , char16_t и char32_t . Значения этих типов предназначены для хранения символов в кодировке UTF-8, UTF-16 или UTF-32 соответственно, а их размеры одинаковы на всех распространенных платформах.
Для определения символов типов char8_t , char16_t и char32_t применяются соответственно префиксы u8, u и U:
char8_t c< u8'l' >; char16_t d< u'l' >; char32_t e< U'o' >;
Стоит отметить, что для вывода на консоль значений char8_t/char16_t/char32_t пока нет встроенных инструментов типа std:cout/std:wcout .
Спецификатор auto
Иногда бывает трудно определить тип выражения. В этом случае можно предоставить компилятору самому выводить тип объекта. И для этого применяется спецификатор auto . При этом если мы определяем переменную со спецификатором auto, эта переменная должна быть обязательно инициализирована каким-либо значением:
auto number = 5; // number имеет тип int auto sum ; // sum имеет тип double auto distance ; // distance имеет тип unsigned long
На основании присвоенного значения компилятор выведет тип переменной. Неинициализированные переменные со спецификатором auto не допускаются:
Типы данных и их вывод
В этом уроке мы познакомимся с особенностями функции printf() и типами данных: целыми и вещественными числами, символами, массивами и строками. Это далеко не все допустимые в C типы. Есть еще указатели, структуры, объединения, перечисления, также в C есть возможность определять собственные типы данных.
Функция printf() и форматированный вывод
Вывод символов на экран, а точнее в стандартный поток вывода, осуществляется в языке C помощью функции printf(). Эта функция выводит на экран строку, переданную первым аргументом, предварительно заменив в ней специальные комбинации символов преобразованными в символы данными, переданными последующими аргументами. Следующие после первой строки данные могут быть строками, символами, целыми или вещественными числами, а также указателями. У каждого типа данных имеется свое обозначение — своя спецификация формата.
На прошлом уроке мы выводили строку "Hello World" вот так:
printf("Hello World\n");
Однако то же самое можно было получить так:
printf("%s\n", "Hello World");
Здесь %s — это спецификация строкового формата, т. е. вместо %s будет подставлен следующий аргумент, данные которого должны быть строкой. Вывод целого числа может выглядеть так:
printf("%d\n", 5);
Вместо числа 5 может стоять переменная целочисленного типа. Функция printf() может принимать произвольное число аргументов:
printf("%d %s, %d %s.\n", 3, "dogs", 2, "cats");
При выводе данные подставляются по очередности следования: 3 на место первой спецификации, dogs на место второй и т.д. То есть следует строго соблюдать соответствие форматов и последующих данных.
Под выводимые данные можно выделять больше знакомест, чем необходимо. Для этого между знаком % и буквой формата прописывается целое число, обозначающие ширину поля, например так: %10d. По умолчанию выравнивание происходит по правому краю. Для выравнивания по левому краю перед числом ставится знак минус.
Напишите программу, которая выводила бы на экране данные примерно так, как на картинке. При этом используйте возможность задать ширину поля, а также выравнивание по левому и правому краям.

Целочисленные типы
В языке C существует несколько типов целых чисел. Они различаются между собой объемом памяти, отводимым под переменную, а также возможностью присваивания положительных и отрицательных значений. От объема памяти, т. е. от количества выделяемых байтов под переменную, зависит, каким может быть максимально возможное значение, записанное в данную переменную. Следует отметить, что в языке Си объем памяти, выделяемый под конкретный тип, может зависеть от операционной системы.
Так, если под переменную какого-либо целочисленного типа выделяется 2 байта, что составляет 16 бит, и ей можно присваивать только положительные числа и ноль, то эти числа будут в диапазоне от 0 до 65535, т. к. 2 16 = 65536, но одна вариация забирается на нуль. Если же тип допускает отрицательные числа, то диапазон допустимых значений уже будет лежать в пределах от -32768 до +32767.
Часто в программах используется тип int. Вот пример, где происходит объявление и определение (присваивание значений) целочисленных переменных, а также вывод их значений на экран:
#include int main() int lines, i; int count = 0; lines = 100; i = -1; printf("%5d %5d %5d\n", i, count+10, lines); >
Обратите внимание, что в языке C присваивать значение можно при объявлении переменных.
Обычно под переменную типа int, которая может принимать как положительные так и отрицательные значения, отводится 4 байта, что равно 32-м битам. Отсюда допустимый диапазон значений будет лежать в пределах от -2 147 483 648 до 2 147 483 647. Если в исходном коде на C мы объявим переменную int max, присвоим ей максимально допустимое значение, а потом будем его увеличивать, то сообщений об ошибке не будет ни на этапе компиляции, ни на этапе выполнения.
#include int main() int max = 2147483647; printf("%d\n", max+1); printf("%d\n", max+2); printf("%d\n", max+10); >
Результат будет таким:
-2147483648 -2147483647 -2147483639
Чтобы понять, почему такое происходит, представьте себе числовую ось не в виде прямой, а в виде окружности. Когда мы достигаем конца, двигаясь например по часовой стрелке, то это значит, что мы пришли в начало. Поэтому, продолжая движение по часовой стрелке, следующее число, которое мы увидим за максимально возможным, – это самое минимальное. Данную особенность языка Си следует иметь в виду при выполнении арифметических действий.
То же самое с минимумом int. Если мы начнем из него вычитать, т. е. двигаться против часовой стрелки, то перескочим максимальную границу и будем идти в направлении уменьшения уже от нее:
#include int main() int min = -2147483648; printf("%d\n", min-1); printf("%d\n", min-2); printf("%d\n", min-10); >
2147483647 2147483646 2147483638
Помимо типа int в языке программирования C существуют другие (модифицированные) целочисленные типы:
- short — отводится меньше байтов, чем на int;
- long — отводится больше байтов, чем на int (не всегда, зависит от системы);
- unsigned — столько же байт как у int, но без отрицательных чисел; в результате чего знаковый разряд освобождается, и количество положительных значений увеличивается;
- unsigned short;
- unsigned long.
При выводе длинных чисел следует дополнять спецификацию формата буквой l перед буквой формата. Например:
printf("%ld\n", i); printf("%15ld\n", i);
Символы
Под символьный тип данных отводится 1 байт памяти. У каждого символа есть соответствующее ему целое число по таблице символов ASCII.
Тип char языка программирования C включает диапазон чисел от -128 до 127. Значения от 0 до 127 могут быть заданы или выведены на экран в виде соответствующих символов (на самом деле не все). Если значение переменной задается в виде символа, то символ заключается в одиночные кавычки, например, так: 'w'. Также в языке существует тип unsigned char с диапазоном чисел от 0 до 255.
С другой стороны, если переменная задана как int или short и ей присвоено значение в диапазоне, где оно может быть представлено символом, то значение можно вывести как символ. Соответственно целочисленной переменной можно присвоить символ.
Если в программе вы будете использовать целые числа со значениями до 127 или 255 и хотите сэкономить память, то объявите переменную как char или unsigned char.
Получается, что в программе символы — это числа, а числа — символы. Тогда как указать, что мы хотим видеть на экране: символ или число? Для вывода на экран символов используется спецификация формата вида %c.
Так программа, представленная ниже,
#include main() char ch = 63; unsigned char uch = 'r'; short j = 'b', k = 99; printf("%c == %d\n", ch, ch); printf("%c == %d\n", uch, uch); printf("%c, %c\n", j, k); >
выдает такой результат:
? == 63 r == 114 b, c
Число 63 по таблице символов ASCII соответствует знаку '?'. Сначала мы выводим значение переменной ch в формате символа, затем – числа. Тоже самое с переменной uch, однако ее значение было задано через символ, а не число.
Вещественные типы данных
В языке C существует три типа чисел с плавающей точкой: float и double (двойной точности) и long double. Также существует три формата вывода вещественных чисел, причем они не связаны с типами, а связаны с удобством представления числа. Вещественные числа могут иметь высокую точность, очень маленькое или очень большое значение. Если выполнить функции printf() с такими параметрами:
double a = 0.0005; printf("%f\n", a); printf("%g\n", 0.0005); printf("%g\n", 0.00005); printf("%e\n", 0.0005);
, то на экране мы увидим следующее:
0.000500 0.0005 5e-05 5.000000e-04
В первом случае (%f) выводится число в обычном виде. По умолчанию точность представления числа равна шести знакам после точки.
Во втором случае (%g) число выводится как обычно, если количество значащих нулей не больше четырех. Если количество значащих нулей четыре и больше, то число выводится в нормализованном виде (третий случай). Запись 5e-5 означает 5 * 10 -5 , что равно 0.00005. А, например, запись 4.325e+3 является экспоненциальной записью 4.325 * 10 3 , что равно 4325. Если с такой формой представления чисел вы сталкиваетесь первый раз, то почитайте дополнительные источники, например, статью в Википедии "Экспоненциальная запись".
Четвертый формат (%e) выведет число исключительно в нормализованном виде, каким бы это вещественное число ни было.
Если при выводе требуется округлить число до определенной точности, то перед буквой-форматом ставят точку и число-указатель точности. Например, printf("%.2f", 0.23) выведет на экран 0.23, а не 0.230000. Когда требуется указать еще и поле, то его ширину прописывают перед точкой, например, %10.3f.
Массивы
Переменные, содержащие массивы, в языке программирования C объявляются, например, так:
int arr[5], nums[N]; float f_arr[100]; char str[80];
Если при указании количества элементов используется константа, она должна быть определена до своего использования следующим образом (чаще константы определяют вне функций):
#define N 100
На самом деле #define является командой препроцессора, используемой не только для определения констант. Когда препроцессор обрабатывает исходный файл программы, он подставляет во все места, где была упомянута константа, ее значение.
Индексация массивов в языке программирования C начинается с нуля.
Присваивание значений элементам массивов можно произвести сразу или в процессе выполнения программы. Например:
char vowels[] = 'a', 'e', 'i', 'o', 'u', 'y'>; float f_arr[6]; f_arr[0] = 25.3; f_arr[4] = 34.2; printf("%c, %.2f\n", vowels[4], f_arr[0]);
Когда переменная-массив объявляется и сразу определяется (как в случае vowels), то размер массива можно не указывать, т. к. он вычисляется по количеству элементов, переданных в фигурных скобках.
Строки
В языке программирования С нет отдельного строкового типа данных, хотя формат вывода строки есть (%s). Строки в C – это массивы символов, последний элемент которых является первым (с номером 0) символом в таблице ASCII. В этом месте таблицы стоит "ничто", имеющее символьное обозначение '\0'.
С другой стороны, строки — это необычные массивы в том смысле, что работа с ними в языке программирования C несколько отличается от работы с числовыми массивами. В этом мы убедимся позже.
Выше мы объявили и определили массив vowels. Если бы мы его определили вот так:
char vowels[] = 'a', 'e', 'i', 'o', 'u', 'y', '\0'>;
char vowels1[] = "aeiouy";
то он был бы строкой. Во втором случае сами двойные кавычки "говорят" что это строка, и символ окончания строки '\0' записывается в память автоматом.
Массивы символов можно выводить на экран, просто указав имя переменной, а вот с массивами чисел такой номер не пройдет:
printf("%s\n", vowels); printf("%f\n", f_arr); // ошибка
Функция sizeof()
Функция sizeof() языка C принимает в качестве аргумента константу, тип данных или переменную и возвращает количество байт, которые отведено под этот объект в памяти.
При выводе на экран значения, возвращаемого sizeof() используется формат %lu (длинное целое без знака). Примеры:
int a = 10; int b[100]; printf("Integer: %lu \n", sizeof(a)); printf("Float: %lu \n", sizeof(float)); printf("Array of 100 integers: %lu \n", sizeof(b));
Напишите программу, выводящую информацию о количестве байтов, отводимых в памяти под типы данных, которые были изучены на данном уроке. При работе с массивами символов, определяемыми как строковые литералы (в двойных кавычках), обратите внимание, что размер массива больше на единицу, чем количество видимых символов.
Курс с решением части задач:
pdf-версия
test_po_protsedurnomu_prog
Только сегодня: скидка до 20% в подарок на первый заказ.
Какую работу нужно написать?
Другую работу
Помощник Анна
- Какой операции нет в с++? ПОСЛЕДОВАТЕЛЬНОЙ
- В каком файле заголовков определён объект cout? IOSTREAM.H
- Что понимается под потоком в с++? МЕХАНИЗМ ВВОДА/ВЫВОДА
- К каким числам применима операция %? К ЦЕЛЫМ
- Если есть два объявления int qwerty; int QWERTY; то какое из утверждений верно? ОБА ОБЪЯВЛЕНИЯ ПРАВИЛЬНЫЕ
- В языке с++ используется стандартная функция pow(x, y). Это… ФУНКЦИЯ ВОЗВЕДЕНИЯ Х В СТЕПЕНЬY
- В какие скобки заключаются комментарии? /* */
- Ключевое слово void обозначает, что функция НИЧЕГО НЕ ВОЗВРАЩАЕТ
- Какой статус международного стандарта языка с++? ПРИНЯТISOИ ТЕМ САМЫМ АВТОМАТИЧЕСКИ ПРИНЯТ ВО СВЕХ СТРАНАХ
- Значение переменной number не лежит между 3 и 6, укажите правильный вариант записи данного утверждения на языке с++ NUMBER< 3 ||NUMBER> 6
- Для того чтобы вывести символ новой строки, нужно… ВОСПОЛЬЗОВАТЬСЯ СПЕЦИАЛЬНЫМ МАНИПУЛЯТОРОМENDL
- Что является отправной точкой компьютерной программы? ФУНКЦИЯMAIN
- Определите значение целочисленных переменных a и b после выполнения следующего фрагмента программы a = 2468; b = (a%1000)*10; a= =a/1000+b; A= 4682,B= 4680
- Что из перечисленного используется для перевода вывода на следующую строку? ENDL
- Для чего нужен cin? ПОЛУЧАТЬ ИНФОРМАЦИЮ (ДАННЫЕ) ОТ ПОЛЬЗОВАТЕЛЯ
- Какая группа содержит последовательность правильно записанных на языке С знаков операций отношений? =,>=,
- В результате успешной компиляции программы с++ с каким расширением будет получен файл? .EXE
- Какое действие выполняется при открытии файла? УСТАНАВЛИВАЕТСЯ ВИД (РЕЖИМ) ИСПОЛЬЗОВАНИЯ ФАЙЛА)
- Какая функция, записанная в заголовочном файле, читает строку символов из файла? F.GETS()
- Логическое «и» обозначается &&
- Когда заранее не известно, сколько раз должна исполняться группа операторов, для прерывания повторения можно использовать … значение КОНТРОЛЬНОЕ
- Каким знаком заканчивается большинство строк кода в Си++? ТОЧКА С ЗАПЯТОЙ
- Выберете однострочный комментарий С++ // ОДНОСТОЧНЫЙ КОММЕНТАРИЙ
- Отметьте истинное высказывание: ПЕРЕМЕННАЯ ОБЪЯВЛЯЕТСЯ, ПОТОМ ИНИЦИАЛИЗИРУЕТСЯ И ИЗМЕНЯЕТСЯ
- Выполнение каждой программы на С++ начинается с функции MAIN
- Какое высказывание для кода верно int a,b,c,d; a=1; b=2; c=c+b+p; cout КОД НЕ ВЕРЕН, ПОТОМУ ЧТО ПЕРЕМЕННАЯ Р НЕ ОБЪЯВЛЕНА
- Какой размер в байтах имеет переменная вещественного типа float? 4
- Из чего состоит оператор объявления имени? ИЗ НАЗВАНИЯ ТИПА И ОБЪЯВЛЯЕМОГО ИМЕНИ
- Нелогической операцией является… =
- Как обозначается в языке С (С++) следующий режим работы с потоком – создание нового файла для записи и чтения? А+
- Чему равен результат вычисления выражения (b-x)*3+b при x = 12 и b = 8 -4
- Параметры функции описан как “int& a”. Соответствующий ему аргумент может быть ПЕРЕМЕННАЯ ТИПАINT
- Какой вариант записи на языке С формулы 0(X>0)AND(X< 10)
- Если после выражения стоит точка с запятой, то … ЭТО ОПЕРАТОР-ВЫРАЖЕНИЕ, ДЕЙСТВИЕ КОТОРОГО ЗАКЛЮЧАЕТСЯ В ВЫЧИСЛЕНИИ ВЫРАЖЕНИЯ
- Как написать следующее выражение на языке С «Переменной а присвоено значение b»? А =B
- Определите результат выполнения следующего кода float*thingPtr=new float (3.14159) ДАННАЯ СТРОКА ЗАДАËТ ЗНАЧЕНИЕ ОБЪЕКТУ ТИПАFLOAT
- x ++ эквивалентно следующему выражению Х = Х + 1
- Что будет выведено на экран дисплея при выполнении следующей последовательность операторов X=2; cout 3
- Логическое «не» обозначается !
- Логическое «не равно» обозначается !=
- Команда, которая используется для передачи управления из функции к вызывающей функции, - это RETURN
- Чему равно значение выражения (a||b&&a||c), где a,b,c – величины типа bool, имеющие значение false, true и true соответственно? TRUE
- Функция вычисляет произведение двух чисел. Исходные данные вводятся с клавиатуры. Какие проверки целесообразно ввести в программе? ПРОВЕРКА, ЧТО ИСХОДНЫЕ ДАННЫЕ ЯВЛЯЮТСЯ ЧИСЛАМИ
- Какой диапазон значений имеет тип int для 32-разрядных вычислительных систем? ОТ 0 ДО 4 294 967 295
- В языке Си++ литерал – это … БУКВА
- Результат какого типа может возвращать логическое выражение? BOOLEAN
- Зачем в С++ используют оператор return? ФУНКЦИЯ, В КОТОРОЙ ОН СОДЕРЖИТСЯ, ЗАВЕРШАЕТ СВОЁ ВЫПОЛНЕНИЕ И УПРАВЛЕНИЕ ВОЗВРАЩАЕТСЯ В ТО МЕСТО ПРОГРАММЫ, ИЗ КОТОРОГО ВЫЗЫВАЛАСЬ ДАННАЯ ФУНКЦИЯ
- Укажите правильный идентификатор имени переменной: _RI18
- Что такое функция? НЕКОТОРАЯ ЧАСТЬ ПРОГРАММЫ, ИМЕЮЩАЯ СОБСТВЕННОЕ ИМЯ, КОТОРАЯ МОЖЕТ ВЫЗЫВАТЬСЯ ИЗ ОСНОВНОЙ ПРОГРАММЫ
- Какое выражение не содержит синтаксических ошибок? -0.18*А/R-0.2*T
- Укажите в каком выражении на языке С++ неправильно применяются операции с действительными типами FLOATA=2,B=0*24,C;C=A+B%A; +
- Выберете верное утверждение КОММЕНТАРИИ ИГНОРИРУЮТСЯ КОМПИЛЯТОРОМ
- Поток cout ВЫВОДА Х И ПЕРЕВОДА КУРСОРА ВЫВОДА НА НОВУЮ СТРОКУ
- Какие из простых типов данных можно выводить на экран, используя поток вывода? ВСЕ ИЗВЕСТНЫЕ ПРОСТЫЕ ТИПЫ ДАННЫХ
- К чему применяется операция инкремента? К ПЕРЕМЕННЫМ
- Определите результат выполнения следующего фрагмента программы int a; a=4/3; А=1
- Что выполняет операция ++ в языке С++? УВЕЛИЧИВАЕТ ЗНАЧЕНИЕ ОПЕРАНДА НА ЕДИНИЦУ
- В каких случаях необходимо использовать оператор return в теле функции? ЕСЛИ НЕОБХОДИМО, ЧТОБЫ ФУНКЦИЯ ВЕРНУЛА ЗНАЧЕНИЕ
- Чему равно значение выражения !((1||0)&&0)? 1
- Является х переменной или константой в выражении у =12+х? НЕЛЬЗЯ ОПРЕДЕЛИТЬ
- Отметьте правильные объявления переменных: INTSD1K_K;
- Если в арифметическом выражении участвуют короткое целое и длинное целое, то … КОРОТКОЕ ПРИВОДИТСЯ К ДЛИННОМУ
- Укажите, какое из следующих утверждений истинное ТИПЫ АРГУМЕНТОВ В ВЫЗОВЕ ФУНКЦИИ ДОЛЖНЫ БЫТЬ СОГЛАСОВАНЫ С ТИПАМИ СООТВЕТСТВУЮЩИХ ПАРАМЕТРОВ В СПИСКЕ ПАРАМЕТРОВ ПРОТОТИПА ФУНКЦИИ
- Оператор … используется для принятия решений IF
- Если int n = 3, каков будет результат switch(n) ? БББ
- Оператор выбора … используется для выполнения одного действия, если его условие истинно, и другого действия, если условие ложно IF…ELSE
- Укажите оператор выбора в языке С++ SWITCH…CASE
- Чему будет равно переменная с в результате выполнения следующей программы a=120; b=100; a=a+b/2; if (b C=185
- Записан оператор If (условие) S;. Если условие не выполняется, то какой оператор будет выполнен? СЛЕДУЮЩИЙ ОПЕРАТОР ПРОГРАММЫ
- Определите значение переменной с после выполнения следующего фрагмента программы a=40; b = 80; b=-a-2*b; if (a 240
- Чему будет равно n после выполнения фрагмента программы int s=0, n=32; while (n>s) ? 16
- Что будет напечатано в результате выполнения следующей программы int s=175, n=0; while (s+n <325)
cout 95 - Определите, что будет напечатано в результате выполнения следующего фрагмента программы int i=2; do while (i<=1000); СТЕПЕНИ ДВОЙКИ СО 2-ОЙ ПО 10-УЮ
- Чему будет равно b в результате выполнения следующей программы int a=7; int b=10+a*2; while (b<100) ? 102
- Какое число будет напечатано после выполнения следующей программы int n,s; n=1, s=26; while (s <=205)
cout 512 - Чему будет равно s после выполнения следующей программы s=0; k=1; while (k <11)
? 55 - Что будет напечатано в результате выполнения следующей программы int s=-1, n=3; while (6*s*s*s*s*s>800*s*s*s) cout 205
- Чему будет равно n после выполнения следующей программы int n, s; s=0; n=0; while (s<=267)
? 110 - Чему будет равно n после выполнения следующей программы int n, s; s=0; n=0; while (s<=35)
? 9 - Какое из утверждений верно для следующей функции int i; long f=1; for (i=1; i ФУНКЦИЯ ВЫЧИСЛЯЕТ ФАКТОРИАЛ ЦЕЛОГО ЧИСЛА
- Чему будет равно n после выполнения следующей программы int n, s; s=0; n=0; while (s<=55)
? 24 - Что выводит следующая программа for (int i=35; I ? НАТУРАЛЬНЫЕ ЧИСЛА ОТ 35 ДО 87, КОТОРЫЕ ПРИ ДЕЛЕНИИ НА 7 ДАЮТ ОСТАТОК 1,2 ИЛИ 5
- Сколько раз выполнится следующий оператор цикла int i=1; while (i>3) I = i+1;? НИ ОДНОГО
- Определите, чему будет равно s после выполнения следующей программы int s=0, n=5; while (n>0) (s=s+n; n=n-1;>15
- Какое число будет напечатано после выполнения следующей программы int n, s; n=1, s=26; while (s <=205)
cout 512 - Что выведет следующая программа i=1; do while (I < 20)? ВЫВОДИТ 1-19
- Чему будет равно i после выполнения следующей программы i=0; s=70; while (s>7) ? 9
- Что выведет следующая программа n=4, s=0; while (n <=13)
cout 150 - Что вычисляет следующая программа int sum = 0; for (int i=1; iСУММУ НАТУРАЛЬНЫХ ЧИСЕЛ ОТ 1 ДОNВКЛЮЧИТЕЛЬНО
- Чему будет равно s после выполнения следующей программы s=0; n=хз; while (n>1) ? 20
- Что делает следующая программа for (int i=10; iВЫВОДИТ КВАДРАТЫ НАТУРАЛЬНЫХ ЧИСЕЛ ОТ 10 ДО 20 ВКЛЮЧИТЕЛЬНО
- Определите, чему будет равно s после выполнения следующей программы int s=0, n=40; while (s+n <100) (s=s+25; n=n-5;>75
- Какой размер массива М будет после выполнения кода char M[]=”\nGoodlive”? 9
- Что из себя представляет динамическое выделение памяти? ПАМЯТЬ ПОД ОБЪЕКТ (ПЕРЕМЕННУЮ) МОЖЕТ ВЫДЕЛЯТЬСЯ НЕ СРАЗУ, А В ПРОЦЕССЕ РАБОТЫ ПРОГРАММЫ, ОСВОБОЖДЕНИЕ ПАМЯТИ ПРОИЗВОДИТСЯ ВРУЧНУЮ
- Чему будут равны элементы этого массива после выполнения следующего фрагмента программы for (i=0; i? 9876556789
- Какое значение будет присвоено переменной Х в программе С++ оператором Х=m[13]? 14-ГО ЭЛЕМЕНТА(как мы нормально считаем)
- Чему окажутся равны элементы данного массива for (i= 0; I =1; i--) A[i-1]=A[i];? 99999999999
- Что описывает данная строка программы: float mas=new int[3][2]? ДАННАЯ СТРОКА ПРЕДСТАВЛЯЕТ СОБОЙ ОШИБОЧНУЮ ЗАПИСЬ И РАБОТАТЬ НЕ БУДЕТ
- Как написать следующее выражение «Второму элементу массива Myarray присвоено значение пяти»? INT MYARRAY[1] = 5
- Что меняет местами следующий алгоритм k = 1; for (i=1; i? ЭЛЕМЕНТЫ ДИАГОНАЛИ И K-ОЙ СТРОКИ ТАБЛИЦЫ
- Что напечатает следующая программа int imax=0, imin=0; for (int i=1; ia[imax]) imax=I; if (a[I ХЗ, НО В ОТВЕТЕ СУММА НОМЕРОВ МИНИМАЛЬНОГО И МАКСИМАЛЬНОГО ЭЛЕМЕНТОВ
- В какой из следующих строк, записанных на языке С++, выполняется обращение к седьмому элементу массива, размер которого равен 10? MAS[6]
- Определите, что будет вычислено в результате выполнения следующей программы summa=0; for (i=0; iСУММА 100 ПЕРВЫХ ЭЛЕМЕНТОВ МАССИВА
- В языке Си++ указатель – это СИМВОЛИЧЕСКОЕ ПРЕДСТАВЛЕНИЕ АДРЕСА ЯЧЕЙКИ ПАМЯТИ
- Какой индекс у 3-его элемента массива int B[100] в языке С++? 2
- Что делает следующая программа int max=a[0]; for (int i=1; imax) max=a[i];>? НАХОДИТ НАИБОЛЬШИЙ ЭЛЕМЕНТ МАССИВА
- Что вычисляет следующая программа int sum=0; for (int i=0; I – ХЗ ЧТО, НО В ОТВЕТАХ СУММУ ОТРИЦАТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА
- Что будет вычислено в результате выполнения следующей программы sum = 0; for (i=0; i 0) sum = sum+A[i]? СУММА ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА
- Какой элемент массива В будет наибольшим после выполнения следующей программы for (n=1; nВ[100]
- Дан массив int L[3][3] = , , >. Чему будет равно значение элемента этого массива L[1][2]? 8
- Что такое массив? ИМЕНОВАННЫЙ НАБОР ПРОНУМЕРОВАННЫХ ПЕРЕМЕННЫХ, ИМЕЮЩИЙ ОДИН ТИП ДАННЫХ, РАСПОЛАГАЮЩИХСЯ В ОДНОЙ ОБЛАСТИ ПАМЯТИ
- Чему будет равно р после выполнения следующей программы int p=1; for (int i=1;i-ХЗ, ответа нет
- Процесс упорядоченного размещения элементов в массиве называется СОРТИРОВКА
- В операторе if проверяется условие if ((x>=a) && (x<=b))/. Что означает выполнение этого условия? Х ПРИНАДЛЕЖИТ ОТРЕЗКУ[A,B]
- Чему будет равно s после выполнения программы int s=0, n=26; while (n>s) ? 13
- Каким оператором можно ввести с клавиатуры n элементов массива Х? FOR (I=0; I> X[I]
- Сколько элементов массива В будут иметь положительные значения после выполнения следующей программы for (n=1; n 90
- Определите результат выполнения операции в следующей программе int a=7, b=4, x; x=a/b; 1
- Какую директиву препроцессора необходимо подключить для организации форматированного ввода-вывода данных? #INCLUDE
- Чему равно значение выражения (a&&!b||c), где a,b,c – величины типа bool, имеющие значение false, true и true соответственно? TRUE
- Какой массив имеет самый большой размер char *s1="QWERTY"; char s2[7]="qwerty"; char *s3="127*27"; ? ВСЕ МАССИВЫ ИМЕЮТ ОДИНАКОВЫЙ РАЗМЕР
- Если в арифметическом выражении участвуют целый и вещественный операнды, то ЦЕЛЫЙ ТИП ПРИВОДИТСЯ К ВЕЩЕСТВЕННОМУ
- Что является отправной точкой компьютерной программы? ФУНКЦИЯMAIN
- Процесс компиляции программы: ПЕРЕВОДИТ ИСХОДНЫЙ ТЕКСТ В ИСПОЛНЯЕМЫЙ ФАЙЛ
- В идентификаторах можно использовать только: ЗАГЛАВНЫЕ И СТРОЧНЫЕ ЛАТИНСКИ ЕБУКВЫ, ЦИФРЫ И ЗНАК ПОДЧЕРКИВАНИЯ
- Если функция вычисления суммы целых чисел от 1 до n имеет прототип int sum(int n), запишите определение функции, используя рекурсию: ВОЗМОЖНО
- Для чего предназначен оператор continue в языке С++? ПРОПУСКАЕТ ОСТАТОК ТЕЛА ЦИКЛА И ПЕРЕХОДИТ К СЛЕДУЮЩЕЙ ИТЕРАЦИИ
- Как написать следующее выражение «Если переменная index больше size то мы инкрементируем переменную count »? if (index>size)
- Объявление char *buf; соответствует созданию указателяbufна символьное значение
- Что называется прототипом функции? ИМЯ ФУНКЦИИ И ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ
- Какое ключевое слово языка С++ используется для описания структурированного типа данных, все элементы которого в памяти начинаются с одного байта? UNION
- Тело какого цикла будет выполнено хотя бы раз, независимо от истинности условия? DO WHILE
Типы данных С++
В данном разделе будут рассмотрены основные типы данных в С++, эти типы данных ещё называются встроенными. Язык программирования С++ является расширяемым языком программирования. Понятие расширяемый означает то, что кроме встроенных типов данных, можно создавать свои типы данных. Поэтому в С++ существует огромное количество типов данных. Мы будем изучать только основные из них.
целочисленный (логический) тип данных
целочисленный (символьный) тип данных
целочисленные типы данных
типы данных с плавающей точкой
В таблице 1 представлены основные типы данных в С++. Вся таблица делится на три столбца. В первом столбце указывается зарезервированное слово, которое будет определять, каждое свой, тип данных. Во втором столбце указывается количество байт, которое отводится под переменную с соответствующим типом данных. В третьем столбце показан диапазон допустимых значений. Обратите внимание на то, что в таблице все типы данных расположены от меньшего к большему.
Тип данных bool
Первый в таблице — это тип данных bool — целочисленный тип данных, так как диапазон допустимых значений — целые числа от 0 до 255. Но как Вы уже заметили, в круглых скобочках написано — логический тип данных, и это тоже верно. Так как bool используется исключительно для хранения результатов логических выражений. У логического выражения может быть один из двух результатов true или false . true — если логическое выражение истинно, false — если логическое выражение ложно.
Но так как диапазон допустимых значений типа данных bool от 0 до 255, то необходимо было как-то сопоставить данный диапазон с определёнными в языке программирования логическими константами true и false . Таким образом, константе true эквивалентны все числа от 1 до 255 включительно, тогда как константе false эквивалентно только одно целое число — 0. Рассмотрим программу с использованием типа данных bool .
// data_type.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < bool boolean = 25; // переменная типа bool с именем boolean if ( boolean ) // условие оператора if cout
В строке 9 объявлена переменная типа bool , которая инициализирована значением 25. Теоретически после строки 9 , в переменной boolean должно содержаться число 25, но на самом деле в этой переменной содержится число 1. Как я уже говорил, число 0 — это ложное значение, число 1 — это истинное значение. Суть в том, что в переменной типа bool могут содержаться два значения — 0 (ложь) или 1 (истина). Тогда как под тип данных bool отводится целый байт, а это значит, что переменная типа bool может содержать числа от 0 до 255. Для определения ложного и истинного значений необходимо всего два значения 0 и 1. Возникает вопрос: «Для чего остальные 253 значения?».
Исходя из этой ситуации, договорились использовать числа от 2 до 255 как эквивалент числу 1, то есть истина. Вот именно по этому в переменной boolean содержится число 25 а не 1. В строках 10 -13 объявлен оператор условного выбора if, который передает управление оператору в строке 11, если условие истинно, и оператору в строке 13, если условие ложно. Результат работы программы смотреть на рисунке 1.
CppStudio.com
true = 1 Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Тип данных bool
Тип данных char
Тип данных char — это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char . Для представления символов в C++ типу данных char отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.
ASCII ( от англ. American Standard Code for Information Interchange) — американский стандартный код для обмена информацией.
Рассмотрим программу с использованием типа данных char .
// symbols.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < char symbol = 'a'; // объявление переменной типа char и инициализация её символом 'a' cout
Итак, в строке 9 объявлена переменная с именем symbol , ей присвоено значение символа 'a' ( ASCII код ). В строке 10 оператор cout печатает символ, содержащийся в переменной symbol . В строке 11 объявлен строковый массив с именем string , причём размер массива задан неявно. В строковый массив сохранена строка "cppstudio.com" . Обратите внимание на то, что, когда мы сохраняли символ в переменную типа char , то после знака равно мы ставили одинарные кавычки, в которых и записывали символ. При инициализации строкового массива некоторой строкой, после знака равно ставятся двойные кавычки, в которых и записывается некоторая строка. Как и обычный символ, строки выводятся с помощью оператора cout , строка 12 . Результат работы программы показан на рисунке 2.
CppStudio.com
symbol = a string = cppstudio.com Для продолжения нажмите любую клавишу . . .
Рисунок 2 — Тип данных char
Целочисленные типы данных
Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук: short int , unsigned short int , int , unsigned int , long int , unsigned long int . Все они имеют свой собственный размер занимаемой памяти и диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned — без знака. Приставка unsigned говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int и unsigned short int .
Приставки целочисленных типов данных:
short — приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;
long — приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;
unsigned (без знака) — приставка увеличивает диапазон положительных значений в два раза, при этом диапазон отрицательных значений в таком типе данных храниться не может.
Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int . Благодаря приставкам short , long , unsigned появляется некоторое разнообразие типов данных int , различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.
Типы данных с плавающей точкой
В С++ существуют два типа данных с плавающей точкой: float и double . Типы данных с плавающей точкой предназначены для хранения чисел с плавающей точкой. Типы данных float и double могут хранить как положительные, так и отрицательные числа с плавающей точкой. У типа данных float размер занимаемой памяти в два раза меньше, чем у типа данных double , а значит и диапазон принимаемых значений тоже меньше. Если тип данных float объявить с приставкой long , то диапазон принимаемых значений станет равен диапазону принимаемых значений типа данных double . В основном, типы данных с плавающей точкой нужны для решения задач с высокой точностью вычислений, например, операции с деньгами.
Итак, мы рассмотрели главные моменты, касающиеся основных типов данных в С++. Осталось только показать, откуда взялись все эти диапазоны принимаемых значений и размеры занимаемой памяти. А для этого разработаем программу, которая будет вычислять основные характеристики всех, выше рассмотренных, типов данных.
// data_types.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include // библиотека манипулирования вводом/выводом #include // заголовочный файл математических функций #include using namespace std; int main(int argc, char* argv[]) < cout << " data type " << "byte" << " " << " max value " << endl // заголовки столбцов << "bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/
Данная программа выложена для того, чтобы Вы смогли просмотреть характеристики типов данных в своей системе. Не стоит разбираться в коде, так как в программе используются управляющие операторы, которые Вам, вероятнее всего, ещё не известны. Для поверхностного ознакомления с кодом программы, ниже поясню некоторые моменты. Оператор sizeof() вычисляет количество байт, отводимое под тип данных или переменную. Функция pow(x,y) возводит значение х в степень y , данная функция доступна из заголовочного файла . Манипуляторы fixed и setprecision() доступны из заголовочного файла . Первый манипулятор — fixed , передаёт в поток вывода значения в фиксированной форме. Манипулятор setprecision(n) отображает n знаков после запятой. Максимальное значение некоторого типа данных вычисляется по такой формуле:
max_val_type = 2^(b * 8 - 1) - 1; // для типов данных с отрицательными и положительными числами // где, b - количество байт выделяемое в памяти под переменную с таким типом данных // умножаем на 8, так как в одном байте 8 бит // вычитаем 1 в скобочках, так как диапазон чисел надо разделить надвое для положительных и отрицательных значений // вычитаем 1 в конце, так как диапазон чисел начинается с нуля // типы данных с приставкой unsigned max_val_type = 2^(b * 8 ) - 1; // для типов данных только с положительными числами // пояснения к формуле аналогичные, только в скобочка не вычитается единица
Пример работы программы можно увидеть на рисунке 3. В первом столбце показаны основные типы данных в С++, во втором столбце размер памяти, отводимый под каждый тип данных и в третьем столбце — максимальное значение, которое может содержать соответствующий тип данных. Минимальное значение находится аналогично максимальному. В типах данных с приставкой unsigned минимальное значение равно 0.
CppStudio.com
data type byte max value bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 4294967295.00 long int = 4 2147483647.00 unsigned long int = 4 4294967295.00 float = 4 2147483647.00 double = 8 9223372036854775808.00 Для продолжения нажмите любую клавишу . . .
Рисунок 3 — Типы данных С++
Если, например, переменной типа short int присвоить значение 33000, то произойдет переполнение разрядной сетки, так как максимальное значение в переменной типа short int это 32767. То есть в переменной типа short int сохранится какое-то другое значение, скорее всего будет отрицательным. Раз уж мы затронули тип данных int , стоит отметить, что можно опускать ключевое слово int и писать, например, просто short . Компилятор будет интерпретировать такую запись как short int . Тоже самое относится и к приставкам long и unsigned . Например:
// сокращённая запись типа данных int short a1; // тоже самое, что и short int long a1; // тоже самое, что и long int unsigned a1; // тоже самое, что и unsigned int unsigned short a1; // тоже самое, что и unsigned short int
К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!