знаки в программировании что означают
Программирование с нуля
Данная статья описывает основные конструкции в программировании и предназначена для тех, кто хочет в этом разобраться. Но статья не описывает все нюансы, потому что их слишком много. Если описывать их все, будет очень нудно и непонятно.
Использовать будем си-подобный синтаксис, то есть подобный языку си, но не будем вникать в заголовочные файлы, указатели и другие особенности относительно низкоуровневых языков, перейдём на синтаксис более высокоуровневых языков, которые сделают рутинную работу за нас. А конкретно, будем использовать синтаксис языка Java. Добро пожаловать под кат.
Двоичная система счисления
Числа в двоичной системе счисления состоят всего из двух знаков. Нуля и единицы. 00000001 – число один. 00000010 – число два. 00000100 – число 4. Как вы можете заметить, когда единица смещается влево, число увеличивается в два раза. Чтобы получилось число 3, необходимо написать 00000011. Таким образом можно составить все необходимые числа. В данном примере мы использовали двоичное число с восемью знаками, иначе говоря число восьмиразрядное. Чем больше у числа разрядов, тем большее оно может вместить значение. Например, восьмиразрядное число вмещает максимальное значение 255, если считать ноль, тогда 256, а в программировании ноль считается всегда. Если увеличить разряд на один, получится девятиразрядное число и его вместимость увеличится в два раза, то есть станет 512. Но так в программировании никогда не делается и обычно каждая следующая разрядность увеличивается вдвое. Один разряд, потом 2 разряда, потом 4 разряда, потом 8 разрядов, потом 16 разрядов, потом 32 разряда и далее.
Шестнадцатеричная система счисления
Всё аналогично двоичной, только вместо нулей и единиц участвуют цифры от 0 до 15. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, где A – 10, B – 11, C – 12, D – 13, E – 14, F – 15.
Знак минус в программировании
Буквы и знаки
Буквы, знаки, смайлики и так далее обозначаются также числами. Буква А может быть числом 00000001 или любым другим, или даже комбинацией чисел в зависимости от кодировки символов. Кодировок много.
Типы данных
В программировании есть типы данных. Числовые, такие как 233, которые разобрали выше. Называются почти везде int, от слова integer. С плавающей запятой, такие как 198,76, называются почти везде float. У букв тип char, у строк тип String. Тип bool имеет два значения – истина (true) и ложь (false). У этого типа реализация в разных языках разная, но самая простая, когда ноль — значит ложь, а любое другое число истину. Нестандартные типы данных, такие как числа с фиксированной запятой, рассматривать не будем.
Применение
Прежде чем использовать числа в программировании их нужно объявить, то есть сказать с помощью языка программирования, что они существуют.
Это стандартное объявление примитивного типа.
Сначала пишем тип, потом имя переменной, то есть нашего числа. Всегда заканчиваем наше выражение, да и любое, точкой с запятой.
Теперь мы можем использовать переменную по её имени.
Здесь мы присвоили переменной значение. В отличии от математики в программировании = значит взять значение справа и присвоить переменной слева. = — это знак/оператор присвоения.
Можно объединить объявление и присвоение, то есть сразу инициализировать переменную.
Буквы выделяются одинарными кавычками, строки выделяются двойными кавычками. Числа типа int не выделяются.
К числам с плавающей запятой одинарной точности в конце добавляется f.
К числам с плавающей запятой двойной точности ничего не добавляется.
Операторы
После того как мы записали наше выражение, например сложения,
получается значение. Но так как оно ни одной переменной не присваивается, оно исчезает. Чтобы присвоить значение переменной используется специальный оператор присвоения, который коротко описан выше.
Повторим ещё раз. Он берёт значение со своей правой стороны и присваивает его переменной в левой стороне. Это оператор =, и он не имеет ничего общего со знаком равно из математики.
Также у нас есть логические операторы, такие как (больше),
Лекция 3. Операторы и выражения¶
Архитектура программы¶
Выражения и операторы¶
Понятие оператора¶
Существуют операторы преобразования данных и операторы управления работой программы.
Операции¶
Характеристики операций¶
Приоритет операций¶
Результат операций¶
В языке Си у операций могут быть следующие результаты:
Арифметические операции¶
Знак | Операция |
| Умножение |
/ | Деление и целочисленное деление нацело |
% | Деление по модулю и остаток от деления |
| Сложение |
| Вычитание |
Знак / всегда означает деление. Однако если с обеих сторон от этого знака стоят целые величины (константы, переменные или их комбинации), он означает целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает.
Знак % означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины
Присваивание¶
Особенностью Си является возможность комбинирования операции присваивания с другими операциями, а также выполнение множественного присваивания.
Существуют два класса выражений:
l-value (левостороннее выражение. Может стоять слева от присваивания)
r-value (правостороннее выражение. Может стоять справа от присваивания)
Составное присваивание¶
Эта группа операций позволяет совместить арифметику и присваивание, что дает выразительность и удобочитаемость программам.
Преобразование типов¶
В различных выражениях могут встречаться данные как одного, так и разных типов. Компилятор может выполнять операцию приведения типов по-умолчанию, действуя согласно простого правила: короткие типы приводятся к длинным. Если необходимо изменить стандартное преобразование, то вводят явное приведение типов.
Сравнение¶
Операции сравнения являются бинарными и используются для сравнения двух значений
Значения операций¶
Пример выражения | Результат |
-4+6 | 2 |
c=3+8 | 11 |
5>3 | 1 |
6+(c=3+8) | 17 |
6+c=3+8 | Ошибка! |
Инкремент и декремент¶
будет эквивалентен следующему
будет эквивалентен следующему
Операции инкремента/декремента¶
Что можно сказать о следующей программе?
Ошибка компиляции: l-value required as left operand of assignment
Неопределенное поведение¶
Определение (см. Википедию)
Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Си), программных библиотек и аппаратного обеспечения в определённых маргинальных ситуациях выдавать результат, зависящий от реализации компилятора (библиотеки, микросхемы) и случайных параметров
При его выполнении переменная i может принять значения 13 или 14 для C/C++, 13 для Java, PHP и C#, 12 при реализации на LISP.
Неопределенность в языке C/C++ связана с тем, что согласно стандартам С и С++ побочные эффекты (то есть инкремент в данном случае) могут быть применены в любой удобный для компилятора момент между двумя точками следования (см. раздел Дополнительная информация).
Операторы¶
Основные алгоритмические конструкции¶
Основная теорема структурного программирования
Программа для решения любой задачи может быть составлена из комбинации следования, ветвления и цикла (Бойм-Якопини, 1966).
Классификация операторов¶
Оператор if¶
Оператор if¶
Примеры if¶
Несколько версий одной и той же программы
Удачные/неудачные конструкции¶
Удачные и неудачные конструкции¶
Среди всех приведенных конструкций наиболее удачной следует признать последнюю, так как она лишена нагромождений и воспринимается однозначно.
Если необходимо сравнить значение переменной с набором констант, то лучше отказаться от if в пользу switch
Сложные выражения¶
С позволяет конструировать очень сложные выражения. Эта сложность должна быть оправдана.
Оператор switch¶
Оператор switch¶
Вопрос: Чему будут равны значения переменных, если строка: babah!?
Оператор while¶
Операторы цикла¶
Оператор while¶
Ошибки при организации while¶
В чем состоит ошибка?
Оператор do while¶
Оператор do while¶
Это цикл с постусловием. Тело цикла выполняется как минимум 1 раз
Оператор for¶
Оператор for¶
Оператор for¶
Операторы управления¶
Оператор goto усложняет отладку программы и сильно портит стиль разработчика (‘’спагетти-код’‘)!
Спагетти-код¶
Пример спагетти кода на языке BASIC:
Тоже самое, но без goto:
Оператор break¶
Оператор continue¶
Дополнительная информация¶
Точка следования (англ. Sequence point) — в программировании любая точка программы, в которой гарантируется, что все побочные эффекты предыдущих вычислений уже проявились, а побочные эффекты последующих еще отсутствуют.
В C и C++ определены следующие точки следования:
Знаки в программировании что означают
Любой язык программирования содержит средства представления и обработки текстовой информации. Другое дело, что обычно программист наряду с символами имеет дело с типом данных (формой представления) – строкой, причем особенности ее организации скрыты, а для работы предоставлен стандартный набор функций. В Си, наоборот, форма представления строки является открытой, а программист работает с ней «на низком уровне».
Представление символов и строк в Си
Примечание. Исторически сложившееся «рыночное разнообразие» на момент появления стандарта привело к тому, что имеются несколько кодовых таблиц, представляющих кириллицу:
· работа с текстовыми файлами «вписана» в стандартный ввод-вывод. Например, в Си потоки ввода-вывода могут быть перенаправлены как на текстовый файл, так и на консольный ввод-вывод (клавиатура – экран);
· если приложения не работают с форматами данных друг друга (не совместимы по данным), то единственным форматом обмена является текстовый файл, в котором числовые (или символьные ) данные разделены стандартными разделителями (пробел, табуляция, запятая, точка с запятой, конец строки). Обмен данными через такие файлы называется экспортом-импортом. В Си файлы такого формата читаются стандартными функциями форматного ввода;
· многие приложения (компиляторы, серверные приложения) наряду с оконными интерфейсами имеют возможность работы в режиме командной строки и чтения управляющих (текстовых) командных файлов.
Константа Название Действие
\ a bel Звуковой сигнал
\b bs Курсор на одну позицию назад
\f ff Переход к началу (перевод формата)
\n lf Переход на одну строку вниз(перевод строки)
\r cr Возврат на первую позицию строки
\ t ht Переход к позиции, кратной 8 (табуляция)
\v vt Вертикальная табуляция по строкам
\nn Символ с восьмеричным кодом nn
\xnn Символ с шестнадцатеричным кодом nn
\0 Символ с кодом 0
Некоторые программы и стандартные функции обработки символов и строк (isdigit,isalpha) используют тот факт, что цифры, прописные и строчные (маленькие и большие) латинские буквы имеют упорядоченные по возрастанию значения кодов:
· строка хранится в массиве символов, массив символов может быть инициализирован строкой, а может быть заполнен программно:
· соответствие размерности массива и длины строки транслятором не контролируется, за это несет ответственность программа (программист, ее написавший):
char C[20], B []=”Строка слишком длинная для C ”;
// следить за переполнением массива
// и ограничить строку его размерностью
char A[80] = «123456\r\n»;
char B[] = «aaaaa\033bbbb»;
Функции стандартной библиотеки ввода-вывода обязаны «сглаживать противоречия», связанные с исторически сложившимися формами и анахронизмами в представлении строки в различных устройствах ввода-вывода и операционных системах (текстовый файл, клавиатура, экран) и приводить их к единому внутреннему формату.
Стандартные приемы обработки строк
· редактировать строку «на месте», реализуя вставку и удаление символов или фрагментов;
· организовать посимвольное переписывание входной строки в выходную, с копированием нужных и преобразованных фрагментов (что проще).
Получить символ десятичной цифры из значения целой переменной, лежащей в диапазоне 0..9:
int n; char c; c = n + ‘0’;
Получить символ шестнадцатеричной цифры из значения целой переменной, лежащей в диапазоне 0..15:
Получить значение целой переменной из символа десятичной цифры:
Получить значение целой переменной из шестнадцатеричной цифры:
Преобразовать маленькую латинскую букву в большую:
//— Подсчет количества слов
//— Удаление лишних пробелов при посимвольном переписывании
void nospace(char c1[],char c2[]) <
c 2[ j ++]=’ ‘; // добавить пробел
c 2[ j ++]= c 1[ i ]; // Перенести символ слова
//—- Сравнение строк по значениям кодов
int my_strcmp(unsigned char s1[],unsigned char s2[]) <
if (s1[n] == s2[n]) return 0;
//—- Сравнение строк с заданными «весами» символов
static char ORD[] = » АаБбВвГгДдЕе 1234567890″;
for ( int n=0; ORD[n]!=’\0′; n++)
int my_strcmp(char s1[],char s2[])<
if (c1 == c2) return 0;
Пример: a < b < c >b > a < d < e < g >e > d > a => < c >< b 1 b >< g >< e 3 e > < d 4 d >a 2 a 5 a
Задачу будем решать по частям. Несомненно, нам потребуется функция, которая ищет открывающуюся скобку для самого внутреннего вложенного фрагмента. Имея ее, можно организовать уже известное нам переписывание и «выкусывание». Основная идея алгоритма поиска состоит в использовании переменной-счетчика, которая увеличивает свое значение на 1 на каждую из открывающихся скобок и уменьшает на 1 на каждую из закрывающихся. При этом фиксируется максимальное значение счетчика и позиция элемента, где это происходит.
int i; // Индекс в строке
int k ; // Счетчик вложенности
int max ; // Максимум вложенности
int b; // Индекс максимальной » <"
for (i=0, max=0, b=-1; c[i]!=0; i++)<
Другой вариант: функция ищет первую внутреннюю пару скобок. Запоминается позиция открывающейся скобки, при обнаружении закрывающейся скобки возвращается индекс последней открывающейся. Заметим, что его также можно использовать, просто последовательность извлечения фрагментов будет другая.
int i; // Индекс в строке
int b; // Индекс максимальной » <"
Идея основного алгоритма заключается в последовательной нумерации «выкусываемых» из входной строки фрагментов, при этом на место каждого помещается его номер – значение счетчика, которое для этого переводится во внешнюю форму представления.
//—— Копирование вложенных фрагментов с » выкусыванием»
void copy(char c1[], char c2[])<
int i =0; // Индекс в выходной строке
int k ; // Индекс найденного фрагмента
int n ; // Запоминание начала фрагмента
int m ; // Счетчик фрагментов
for ( n = k ; c 1[ k ]!= ‘>’ ; k ++, i ++) c 2[ i ]= c 1[ k ]; // Переписать фрагмент и его «>»
if ( m /10!=0) c 1[ n ++] = m /10 + ‘0’ ; // На его место две цифры
c 1[ n ++] = m %10 + ‘0’ ; // номера во внешней форме
c 1[ n ]=0; > // сдвинуть » хвост» к началу
for ( k =0; c 1[ k ]!=0; k ++, i ++) c 2[ i ]= c 1[ k ]; // перенести остаток
c 2[ i ]=0;> // входной строки
Практический совет – желательно избегать сложные вычисления над индексами. Лучше всего для каждого фрагмента строки заводить свой индекс и перемещать их независимо друг от друга в нужные моменты. Что, например, сделано при «уплотнении» строки – индекс k после переписывания найденного фрагмента «останавливается» на начале «хвоста» строки, который переносится под индекс n – начало удаляемого фрагмента. Причем записываемые цифры номера смещают это начало на один или два символа. Таким образом, фрагмент заменяется во входной строке на его номер.
Внешняя и внутренняя форма представления чисел
Текст и числовые данные имеют еще одну точку соприкосновения. Дело в том, что все наблюдаемые нами числовые данные – это совсем не то, с чем имеет дело компьютер. При вводе или выводе целого или вещественного числа мы имеем дело со строкой текста, в которой присутствуют символы, изображающие цифры числа – внешней формой представления.
Функции и объекты стандартных потоков ввода/вывода могут, в частности, вводить и выводить целые числа, представленные в десятичной, восьмеричной и шестнадцатеричной системах счисления. При этом происходят преобразования, связанные с переходом от внешней формы представления к внутренней и наоборот.
Обратите внимание, что о системе счисления имеет смысл говорить только тогда, когда число рассматривается в виде последовательности цифр, то есть во внешней форме представления числа. Внутренняя форма представления числа – двоичная и нас, грубо говоря, не интересует, поскольку компьютер корректно оперирует с ней и без нашего участия.
На самом деле алгоритмы ввода-вывода числовых данных (вернее, преобразования данных из внешней формы во внутреннюю, и наоборот) идентичны алгоритмам преобразования чисел из произвольной системы счисления в десятичную (см. 1.3). При этом десятичная система играет роль внутренней («родной») формы представления.
Ввод целого числа сопровождается его преобразованием из внешней формы – последовательности цифр – в внутренней – целой переменной, которая «интегрирует» цифры в одно значение с учетом их веса (что зависит, кроме всего прочего, и от системы счисления, в которой представлено вводимое число). В преобразовании используется тот факт, что при добавлении к числу очередной цифры справа старое значение увеличивается в 10 раз и к нему добавляется значение новой цифры, например:
Значение: 123 1234 = 123 * 10 + 4
Тогда в основу алгоритма может быть положен цикл просмотра всех цифр числа слева направо, в котором значение числа на текущем шаге цикла получается умножением на 10 результата предыдущего цикла и добавлением значения очередной цифры:
//—— Ввод десятичного целого числа
int StringToInt(char c[])<
if (c[i]==’\0′) return 0; // Поиск первой цифры
for (n=0; c[i]>=’0′ && c[i] // Накопление целого
//—- Вывод целого десятичного числа
void IntToString(char c[], int n)
for (nn=n, k=0; nn!=0; k++, nn/=10); // Подсчет количества цифр числа
c[k] = ‘\0’; // Конец строки
for (k—; k >=0; k—, n /= 10) // Получение цифр числа
c[k] = n % 10 + ‘0’; // в обратном порядке
При преобразовании дробной части во внешнюю форму используется тот факт, что при умножении дробной части на 10 (точнее, на основание системы счисления) очередная цифра «вылезает» в целую часть. Из нее формируется символ, после чего целая часть отбрасывается.
//—- Вывод вещественного десятичного числа
void FloatToString(char c[], double v)
for (nn=v, k=0; nn!=0; k++, nn/=10); // Подсчет количества цифр
kk=k-1; c[k++] = ‘.’; // целой части числа
for (nn=v; kk >=0; kk—, nn /= 10) // Получение цифр числа
c[kk] = nn % 10 + ‘0’; // в обратном порядке
v-=(int)v; // Убрать целую часть
Фрагменты вывода целой и дробной частей «сшиваются» путем запоминания местонахождения в строке символа «точка», разделяющего целую и дробную части.
//—— Ввод десятичного вещественного числа
double StringToFloat(char c[])<
if (c[i]==’\0′) return 0; // Поиск первой цифры
for (n=0; c[i]>=’0′ && c[i] // Накопление целого
v=v/10; // весом разряда дробной части
Преобразование, в котором внешняя форма числа задана в другой системе счисления, выполняются аналогично, только вместо числа 10 используется основание системы, а для систем счисления, больших 10, используется особое преобразование символов-цифр во внутреннее представление:
Посимвольная и пословная обработка.
Одну и ту же программу обработки строки текста можно написать разными способами. Если речь идет о формате текстовой строки, то отслеживать его можно двумя способами (см. 3.8):
// Функция возвращает индекс начала слова или 1, если нет слов
// Логика переменной состояния – n – счетчик символов слова
if (s[i]!=’ ‘) n++; // символ слова увеличить счетчик
n=0; // фиксация максимального значения
>> // то же самое для последнего слова
// Структурная логика – 3 цикла: просмотр слов, пробелов и символов
while (in[i]==’ ‘) i++; // Пропуск пробелов перед словом
for (k=0;in[i]!=’ ‘ && in[i]!=0; i++,k++); // Подсчет длины слова
m=k; b=i-k; > // Одновременно запоминается
По завершении посимвольного просмотра строки последнее слово (если после него нет пробела) оказывается необработанным. Поэтому контекст фиксации максимума повторяется после выхода из цикла.
Здесь можно проиллюстрировать еще один принцип разработки программ: после ее написания для произвольной «усредненной» ситуации необходимо проверить ее «на крайности». В данном случае, при отсутствии в строке слов (строка состоит из пробелов или пуста), установленное начальное значение b =-1 будет возвращено в качестве результата (что и задумывалось при установке значения –1 как недопустимого).
Лабораторный практикум
1. В строке найти последовательности цифр, каждую из них считать числом в той системе счисления, которая соответствует максимальной цифре, заменить числа в строке символами с кодами, полученными из этих чисел. Пример: aaa 010101 bbb 343 ccc – двоичная и пятиричная системы счисления.
2. В строке найти последовательности цифр, каждую из них считать числом в той системе счисления, которая соответствует первой цифре, заменить числа в строке символами с кодами, полученными из этих чисел. Пример: aaa 2010101 bbb 8343 ccc – двоичная и восьмиричная системы счисления.
6. Найти в строке два одинаковых фрагмента (не включающих в себя пробелы) длиной более 5 символов, скопировать их в выходную строку и удалить. Повторять этот процесс, пока такие фрагменты находятся. Остаток строки добавить в выходную.
7. Найти во входной строке самую внутреннюю пару скобок <. >и переписать в выходную строку содержащиеся между ними символы. Во входной строке фрагмент удаляется. Повторять этот процесс, пока во входной строке не останется скобок, остаток также переписать в выходную строку.
10. Определить, является ли строка палиандромом (например, «я у ребят беру наган») – удалить пробелы, найти фрагменты – палиандромы максимальной длины и удалить.
Вопросы без ответов
Содержательно определите действие, производимое над строкой. Напишите вызов функции (входные неизменяемые строки могут быть представлены фактическими параметрами – строковыми константами).
4.11 – Символы
На данный момент базовые типы данных, которые мы рассмотрели, использовались для хранения чисел (целые числа и числа с плавающей запятой) или значений истина/ложь (логические значения). Но что, если мы хотим хранить буквы?
ASCII расшифровывается как American Standard Code for Information Interchange (Американский стандартный код для обмена информацией) и определяет конкретный способ представления английских символов (плюс несколько других символов) в виде чисел от 0 до 127 (называемых кодом ASCII или кодовым обозначением). Например, код ASCII 97 интерпретируется как символ ‘ а ‘.
Символьные литералы всегда помещаются в одинарные кавычки (например, ‘ g ‘, ‘ 1 ‘, ‘ ‘).
Ниже приведена полная таблица символов ASCII:
Code | Symbol | Code | Symbol | Code | Symbol | Code | Symbol |
---|---|---|---|---|---|---|---|
0 | NUL (null) | 32 | (space) | 64 | @ | 96 | ` |
1 | SOH (start of header, начало «заголовка») | 33 | ! | 65 | A | 97 | a |
2 | STX (start of text, начало «текста») | 34 | ” | 66 | B | 98 | b |
3 | ETX (end of text, конец «текста») | 35 | # | 67 | C | 99 | c |
4 | EOT (end of transmission, конец передачи) | 36 | $ | 68 | D | 100 | d |
5 | ENQ (enquiry, «Прошу подтверждения!») | 37 | % | 69 | E | 101 | e |
6 | ACK (acknowledge, «Подтверждаю!») | 38 | & | 70 | F | 102 | f |
7 | BEL (bell, звуковой сигнал: звонок) | 39 | ’ | 71 | G | 103 | g |
8 | BS (backspace, возврат на один символ) | 40 | ( | 72 | H | 104 | h |
9 | HT (horizontal tab, горизонтальная табуляция) | 41 | ) | 73 | I | 105 | i |
10 | LF (line feed/new line, перевод строки) | 42 | * | 74 | J | 106 | j |
11 | VT (vertical tab, вертикальная табуляция) | 43 | + | 75 | K | 107 | k |
12 | FF (form feed / new page, «прогон страницы», новая страница) | 44 | , | 76 | L | 108 | l |
13 | CR (carriage return, возврат каретки) | 45 | — | 77 | M | 109 | m |
14 | SO (shift out, «Переключиться на другую ленту (кодировку)») | 46 | . | 78 | N | 110 | n |
15 | SI (shift in, «Переключиться на исходную ленту (кодировку)») | 47 | / | 79 | O | 111 | o |
16 | DLE (data link escape, «Экранирование канала данных») | 48 | 0 | 80 | P | 112 | p |
17 | DC1 (data control 1, первый символ управления устройством) | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 (data control 2, второй символ управления устройством) | 50 | 2 | 82 | R | 114 | r |
19 | DC3 (data control 3, третий символ управления устройством) | 51 | 3 | 83 | S | 115 | s |
20 | DC4 (data control 4, четвертый символ управления устройством) | 52 | 4 | 84 | T | 116 | t |
21 | NAK (negative acknowledge, «Не подтверждаю!») | 53 | 5 | 85 | U | 117 | u |
22 | SYN (synchronous idle) | 54 | 6 | 86 | V | 118 | v |
23 | ETB (end of transmission block, конец текстового блока) | 55 | 7 | 87 | W | 119 | w |
24 | CAN (cancel, «Отмена») | 56 | 8 | 88 | X | 120 | x |
25 | EM (end of medium, «Конец носителя») | 57 | 9 | 89 | Y | 121 | y |
26 | SUB (substitute, «Подставить») | 58 | : | 90 | Z | 122 | z |
27 | ESC (escape) | 59 | ; | 91 | [ | 123 | < |
28 | FS (file separator, разделитель файлов) | 60 | 94 | ^ | 126 | ||
31 | US (unit separator, разделитель юнитов) | 63 | ? | 95 | _ | 127 | DEL (delete, стереть последний символ) |
Коды 0–31 называются непечатаемыми символами и в основном используются для форматирования и управления принтерами. Большинство из них сейчас устарели.
Коды 32–127 называются печатными символами и представляют собой буквы, цифры и знаки препинания, которые большинство компьютеров используют для отображения основного английского текста.
Инициализация переменных char
Вы также можете инициализировать переменные типа char целыми числами, но этого, если возможно, следует избегать.
Предупреждение
Будьте осторожны, чтобы не перепутать символы чисел с целыми числами. Следующие две инициализации не эквивалентны:
Символы чисел предназначены для использования, когда мы хотим представить числа в виде текста, а не в виде чисел и применения к ним математических операций.
Печать переменных типа char
Данная программа дает следующий результат:
Мы также можем напрямую выводить символьные литералы:
В результате это дает:
Напоминание
Печать переменных char как целых чисел через приведение типов
Однако это довольно коряво. Лучше использовать приведение типа. Приведение типа создает значение одного типа из значения другого типа. Для преобразования между базовыми типами данных (например, из char в int или наоборот) мы используем приведение типа, называемое статическим приведением.
Синтаксис статического приведения выглядит немного забавным:
Ключевые выводы
Всякий раз, когда вы видите синтаксис C++ (за исключением препроцессора), в котором используются угловые скобки, то, что между угловыми скобками, скорее всего, будет типом. Обычно C++ работает с концепциями, которым нужен параметризуемый тип.
Ниже показан пример использования статического приведения для создания целочисленного значения из нашего значения char :
Эта программа дает следующий вывод:
Важно отметить, что параметр static_cast вычисляется как выражение. Когда мы передаем переменную, эта переменная вычисляется для получения ее значения, которое затем преобразуется в новый тип. На переменную не влияет приведение ее значения к новому типу. В приведенном выше случае переменная ch по-прежнему является char и сохраняет то же значение.
О статическом приведении типов и других типах приведения мы поговорим подробнее в следующем уроке (8.5 – Явное преобразование типов (приведение) и static_cast ).
Ввод символов
Следующая программа просит пользователя ввести символ, а затем печатает его как символ и его код ASCII:
Ниже показан результат одного запуска:
Вы можете увидеть это поведение в следующем примере:
Размер, диапазон и символ по умолчанию у переменных char
char определяется C++ всегда размером 1 байт. По умолчанию char может быть со знаком или без знака (хотя обычно он со знаком). Если вы используете переменные char для хранения символов ASCII, вам не нужно указывать знак (поскольку переменные char со знаком и без знака могут содержать значения от 0 до 127).
Экранированные последовательности
В C++ есть некоторые символы, которые имеют особое значение. Эти символы называются экранированными последовательностями (управляющими последовательностями, escape-последовательностями). Экранированная последовательность начинается с символа ‘\’ (обратный слеш), за которым следует буква или цифра.
Вы уже видели наиболее распространенную экранированную последовательность: ‘ \n ‘, которую можно использовать для вставки символа новой строки в текстовую строку:
Эта программа выдает:
Еще одна часто используемая экранированная последовательность – ‘ \t ‘, которая включает горизонтальную табуляцию:
Три других примечательных экранированных последовательности:
Ниже приведена таблица всех экранированных последовательностей:
Название | Символ | Назначение |
---|---|---|
Предупреждение | \a | Выдает предупреждение, например звуковой сигнал |
Backspace | \b | Перемещает курсор на одну позицию назад |
Перевод страницы | \f | Перемещает курсор на следующую логическую страницу |
Новая строка | \n | Перемещает курсор на следующую строку |
Возврат каретки | \r | Перемещает курсор в начало строки |
Горизонтальная табуляция | \t | Печать горизонтальной табуляции |
Вертикальная табуляция | \v | Печатает вертикальную табуляцию |
Одинарная кавычка | \’ | Печать одинарной кавычки |
Двойная кавычка | \» | Печать двойной кавычки |
Обратная косая черта | \\ | Печатает обратный слеш |
Вопросительный знак | \? | Печатает вопросительный знак Больше не актуально. Вы можете использовать вопросительные знаки без экранирования. |
Восьмеричное число | \(число) | Преобразуется в символ, представленный восьмеричным числом |
Шестнадцатеричное число | \x(число) | Преобразуется в символ, представленный шестнадцатеричным числом |
Вот несколько примеров:
Эта программа напечатает:
Новая строка ( \n ) против std::endl
В чем разница между заключением символов в одинарные и двойные кавычки?
Отдельные символы всегда заключаются в одинарные кавычки (например, ‘a’, ‘+’, ‘5’). char может представлять только один символ (например, букву а, знак плюса, цифру 5). Что-то вроде этого некорректно:
Текст, заключенный в двойные кавычки (например, «Hello, world!»), называется строкой. Строка – это набор последовательных символов (и, таким образом, строка может содержать несколько символов).
Пока вы можете использовать строковые литералы в своем коде:
Мы обсудим строки в следующем уроке (4.12 – Знакомство с std::string ).
Правило
Всегда помещайте отдельные символы в одинарные кавычки (например, ‘ t ‘ или ‘ \n ‘, а не » t » или » \n «). Это помогает компилятору более эффективно выполнять оптимизацию.
wchar_t следует избегать почти во всех случаях (за исключением взаимодействия с Windows API). Его размер определяется реализацией и не является надежным. Он не рекомендуется для использования.
В качестве отступления.
Англоязычный термин «deprecated» (не рекомендуется) означает «всё еще поддерживается, но больше не рекомендуется для использования, потому что он был заменен чем-то лучшим или больше не считается безопасным».
Подобно тому, как ASCII сопоставляет целые числа 0–127 с символами английского алфавита, существуют и другие стандарты кодировки символов для сопоставления целых чисел (разного размера) с символами других языков. Наиболее известной кодировкой за пределами диапазона ASCII является стандарт Unicode (Юникод), который сопоставляет более 110 000 целых чисел с символами на многих языках. Поскольку Unicode содержит очень много кодовых обозначений, то для одного кодового обозначения, чтобы представить один символ, Unicode требуется 32 бита (кодировка UTF-32). Однако символы Unicode также могут быть закодированы с использованием 16-ти или 8-ми битов (кодировки UTF-16 и UTF-8 соответственно).
char16_t и char32_t были добавлены в C++11 для обеспечения явной поддержки 16-битных и 32-битных символов Unicode. char8_t был добавлен в C++20.
А пока при работе с символами (и строками) вы должны использовать только символы ASCII. Использование символов из других наборов символов может привести к неправильному отображению ваших символов.