Как вывести символ в си

от admin

Ввод и вывод символьных строк в Си

Итак, строки в языке Си. Для них не предусмотрено отдельного типа данных, как это сделано во многих других языках программирования. В языке Си строка – это массив символов. Чтобы обозначить конец строки, используется символ '\0' , о котором мы говорили в прошлой части этого урока. На экране он никак не отображается, поэтому посмотреть на него не получится.

Создание и инициализация строки

Так как строка – это массив символов, то объявление и инициализация строки аналогичны подобным операциям с одномерными массивами.

Следующий код иллюстрирует различные способы инициализации строк.

Рис.1 Объявление и инициализация строк

В первой строке мы просто объявляем массив из десяти символов. Это даже не совсем строка, т.к. в ней отсутствует нуль-символ \0 , пока это просто набор символов.

Вторая строка. Простейший способ инициализации в лоб. Объявляем каждый символ по отдельности. Тут главное не забыть добавить нуль-символ \0 .

Третья строка – аналог второй строки. Обратите внимание на картинку. Т.к. символов в строке справа меньше, чем элементов в массиве, остальные элементы заполнятся \0 .

Четвёртая строка. Как видите, тут не задан размер. Программа его вычислит автоматически и создаст массив символов нужный длины. При этом последним будет вставлен нуль-символ \0 .

Как вывести строку

Дополним код выше до полноценной программы, которая будет выводить созданные строки на экран.

Различные способы вывода строки на экран

Рис.2 Различные способы вывода строки на экран

Как видите, есть несколько основных способов вывести строку на экран.

  • использовать функцию printf со спецификатором %s
  • использовать функцию puts
  • использовать функцию fputs , указав в качестве второго параметра стандартный поток для вывода stdout .

Единственный нюанс у функций puts и fputs . Обратите внимание, что функция puts переносит вывод на следующую строку, а функция fputs не переносит.

Как видите, с выводом всё достаточно просто.

Ввод строк

С вводом строк всё немного сложнее, чем с выводом. Простейшим способом будет являться следующее:

Функция gets приостанавливает работу программы, читает строку символов, введенных с клавиатуры, и помещает в символьный массив, имя которого передаётся функции в качестве параметра.
Завершением работы функции gets будет являться символ, соответствующий клавише ввод и записываемый в строку как нулевой символ.
Заметили опасность? Если нет, то о ней вас любезно предупредит компилятор. Дело в том, что функция gets завершает работу только тогда, когда пользователь нажимает клавишу ввод. Это чревато тем, что мы можем выйти за рамки массива, в нашем случае — если введено более 20 символов.
К слову, ранее ошибки переполнения буфера считались самым распространенным типом уязвимости. Они встречаются и сейчас, но использовать их для взлома программ стало гораздо сложнее.

Итак, что мы имеем. У нас есть задача: записать строку в массив ограниченного размера. То есть, мы должны как-то контролировать количество символов, вводимых пользователем. И тут нам на помощь приходит функция fgets :

Функция fgets принимает на вход три аргумента: переменную для записи строки, размер записываемой строки и имя потока, откуда взять данные для записи в строку, в данном случае — stdin . Как вы уже знаете из 3 урока, stdin – это стандартный поток ввода данных, обычно связанный с клавиатурой. Совсем необязательно данные должны поступать именно из потока stdin , в дальнейшем эту функцию мы также будем использовать для чтения данных из файлов.

Если в ходе выполнения этой программы мы введем строку длиннее, чем 10 символов, в массив все равно будут записаны только 9 символов с начала и символ переноса строки, fgets «обрежет» строку под необходимую длину.

Обратите внимание, функция fgets считывает не 10 символов, а 9 ! Как мы помним, в строках последний символ зарезервирован для нуль-символа.

Давайте это проверим. Запустим программу из последнего листинга. И введём строку 1234567890 . На экран выведется строка 123456789 .

Пример работы функции fgets

Рис.3 Пример работы функции fgets

Возникает вопрос. А куда делся десятый символ? А я отвечу. Он никуда не делся, он остался в потоке ввода. Выполните следующую программу.

Вот результат её работы.

Непустой буфер stdin

Рис.4 Непустой буфер stdin

Поясню произошедшее. Мы вызвали функцию fgets . Она открыла поток ввода и дождалась пока мы введём данные. Мы ввели с клавиатуры 1234567890\n ( \n я обозначаю нажатие клавиша Enter ). Это отправилось в поток ввода stdin . Функция fgets , как и полагается, взяла из потока ввода первые 9 символов 123456789 , добавила к ним нуль-символ \0 и записала это в строку str . В потоке ввода осталось ещё 0\n .

Далее мы объявляем переменную h . Выводим её значение на экран. После чего вызываем функцию scanf . Тут-то ожидается, что мы можем что-то ввести, но т.к. в потоке ввода висит 0\n , то функция scanf воспринимает это как наш ввод, и записывается 0 в переменную h . Далее мы выводим её на экран.

Это, конечно, не совсем такое поведение, которое мы ожидаем. Чтобы справиться с этой проблемой, необходимо очистить буфер ввода после того, как мы считали из него строку, введённую пользователем. Для этого используется специальная функция fflush . У неё всего один параметр – поток, который нужно очистить.

Исправим последний пример так, чтобы его работа была предсказуемой.

Теперь программа будет работать так, как надо.

Сброс буфера stdin функцией fflush

Рис.4 Сброс буфера stdin функцией fflush

Подводя итог, можно отметить два факта. Первый. На данный момент использование функции gets является небезопасным, поэтому рекомендуется везде использовать функцию fgets .

Второй. Не забывайте очищать буфер ввода, если используете функцию fgets .

На этом разговор о вводе строк закончен. Идём дальше.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Как вывести символ в си

При запуске программы на Си автоматически открываются ряд потоков, основными из которых являются следующие:

Стандартный поток ввода stdin

Стандартный поток вывода stdout

Стандартный поток вывода сообщений об ошибках stderr

Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr — экрану монитора.

Для управления вводом-выводом с помощью этих потоков используются ряд функций:

getchar() : ввод с клавиатуры одного символа

putchar() : вывод на консоль одного символа

fgets() : ввод одной строки

puts() / fputs() : вывод одной строки на консоль

scanf() : ввод с консоли с форматированием данных

sscanf() : ввод с из строки с форматированием данных

printf() : вывод с форматированием данных

Функции printf и scanf уже рассматривались ранее, поэтому посмотрим, как применять остальные функции.

Ввод и вывод символов

Для ввода и вывода символа применяются функции getchar() и putchar() . Но следует сказать, что на самом деле они полноценными функциями не являются, а определены как макросы в заголовочном файле stdio.h :

Вывод символа

Для вывода отдельного символа на консоль предназначена функция putchar() со следующим прототипом:

Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.

Ввод символа

Для ввода одного символа с клавиатуры применяется функция getchar() , которая имеет следующий прототип:

В качестве результата функция возвращает числовой код введенного символа.

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

И если буфер операционной системы не пуст, то при вызове функции getc() она получает очередной символ из буфера. Если же буфер пуст, то происходит чтение байта из потока ввода с помощью системной функции, название которой зависит от операционной системы.

При этом при нажатии клавиши Enter, в буфер также помещается код этой клавиши. То есть если мы введем один символ и нажмем на Enter, в буфере окажутся два числовых кода — введенного символа и клавиши Enter. И это надо учитывать при работе с функцией getchar. В частости, рассмотрим простой, но показательный пример:

Сначала на экран выводится цифра 1, после чего функция getchar ожидает ввода символа. Если после ввода символа мы нажмем Enter, то в буфер будет помещены два числовых кода — введеного символа и клавиши Enter. Поэтому при втором вызове getchar эта функция считывает байт из буфера — то есть числовой код клавиши Enter.

Например, введем при первом вызове функции getchar символ «a», а затем Enter:

Но если при каждом вызове getchar мы будем только нажимать клавишу Enter, тогда в буфер будет заноситься только код этой клавиши, и соответственно программа будет работать, как и ожидалось:

Применим функции getchar и putchar для ввода и вывода символов с клавиатуры:

Функция getchar() считывает числовой код символа, который потом выводится в функции putchar() . Для вывода из программы необходимо ввести комбинацию клавиш Ctrl+C.

Ввод и вывод строк

Вывод строк и puts

Для вывода одной строки на консоль предназначена функция puts() со следующим прототипом:

В качестве параметра передается указатель на строку, а возвращаемым результатом функции является последний выведенный символ.

При этом функция puts() будет выводить символы переданной строки, пока не дойдет до нулевого символа ‘\0’. Если же выводимый массив символов не содержит этого символа, то результат программы неопределен. Например:

Вывод строк и fputs

Функция fputs() также записывает в поток вывода строку, то есть набор символов, который завершается символом ‘\0’. При записи строки нулевой символ ‘\0’ не записывается. Она имеет следующий прототип:

Первый параметр функции — записываемая строка, а второй — указатель на поток вывода. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .

Применим функцию для записи в стандартный поток вывода, то есть на консоль. В этом случае в качестве второго параметра надо передать значение stdout :

Ввод строк и fgets

Для ввода строки с клавиатуры применяется функция fgets() , которая имеет следующий прототип:

char *str : строка, в которую производится считывание.

int count : сколько символов необходимо считывать.

FILE *stream : файловый поток, из которого производится считывание. В качестве потока ввода может выступать и консольный ввод.

Функция fgets() прекращает считывание, когда пользователь нажимает клавишу ENTER, то есть когда в поток добавляется символ перевода строки.

Рассмотрим считывание строки с консоли. Для этого в качестве третьего параметра в функцию передается значение stdin :

Здесь функция fgets считывает не более 15 символов в строку name, а В реальности функция предложит ввести 14 символов, так как последний символ зарезервирован для нулевого символа ‘\0’. Если будет введено больше символов, то fgets все равно считает не более 15 символов. Таким образом функция позволяет проверить количество считываемых символов и поэтому считается безопасной.

Пример работы программы:

Стоит отметить, что функция fgets() возвращает указатель char * — указатель на буфер, в который считаны данные. В реальности это тот же самый буфер, который передавался в качестве первого параметра, то есть в примере выше — это массив name. Однако этот результат может нам пригодится для проверки успешности выполнения функции — если считывание прошло неудачно, то функция возвращает NULL :

Форматированный ввод и вывод

Сегодня мы рассмотрим две важные функции форматированного ввода и вывода. Устройство и работу этих функций полностью можно понять только после изучения работы с указателями и функций с переменным числом параметров. Но пользоваться этими функциями необходимо уже сейчас, так что некоторые моменты придётся пропустить.

Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ.
int printf (const char * format, . );

Функция проходит по строке и заменяет первое вхождение % на первый аргумент, второе вхождение % на второй аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.

Общий синтаксис спецификатора формата
%[флаги][ширина][.точность][длина]спецификатор
Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.

Таб. 1 Спецификатор типа.

Спецификатор Что хотим вывести Пример
d или i Целое со знаком в в десятичном виде 392
u Целое без знака в десятичном виде 7235
o Беззнаковое в восьмеричном виде 657
x Беззнаковое целое в шестнадцатеричном виде 7fa
X Беззнаковое целое в шестнадцатеричном виде, верхний регистр 7FA
f или F Число с плавающей точкой 3.4563745
e Экспоненциальная форма для числа с плавающей точкой 3.1234e+3
E Экспоненциальная форма для числа с плавающей точкой, верхний регистр 3.1234E+3
g Кратчайшее из представлений форматов f и e 3.12
G Кратчайшее из представлений форматов F и E 3.12
a Шестнадцатеричное представление числа с плавающей точкой -0xc.90fep-2
A Шестнадцатеричное представление числа с плавающей точкой, верхний регистр -0xc.90FEP-2
c Буква a
s Строка (нуль-терминированный массив букв) Hello World
p Адрес указателя b8000000
n Ничего не печатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n
% Два идущих друг за другом процента выводят знак процента %

Строка формата также может включать в себя следующие необязательные суб-спецификаторы: флаг, ширина, .точность и модификатор (именно в таком порядке).

Таб. 2 Флаги.

Флаг Описание
Выключка влево на заданное шириной значение
+ Явно указывать знак у числа, даже для положительных чисел
(пробел) Если знак не будет выведен, то вставляет пробел перед выводимым числом
# Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X
Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков.
0 Вставляет нули, когда объявлен спецификатор ширины
Таб. 3 Ширина.

Ширина Описание
(число) Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули)
* Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу
Таб. 4 Точность.

.Точность Описание
.число Для спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче, то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится.
Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6).
Для g и G — это число значащих разрядов, которые необходимо вывести.
Для s — выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого.
Если число не стоит, то по умолчанию точность равна 0
.* Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

Суб-спецификатор длины изменяет длину типа. В случае, если длина не совпадает с типом, по возможности происходит преобразование до нужного типа.

Таб. 5 Длина.

спецификаторы
Длина d, i u o x X f F e E g G a A c s p n
(none) int unsigned int double int char* void* int*
hh signed char unsigned char signed char*
h short int unsigned short int short int*
l long int unsigned long int wint_t wchar_t* long int*
ll long long int unsigned long long int long long int*
j intmax_t uintmax_t intmax_t*
z size_t size_t size_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
L long double

Форматированный ввод

Рассмотрим форматированный ввод функцией scanf.
int scanf(const char*, . )
Функция принимает строку формата ввода (она похожа на строку формата printf) и адреса, по которым необходимо записать считанные данные. Возвращает количество успешно проинициализированных аргументов.
Формат спецификатора ввода
%[*][ширина][длинна]спецификатор

Таб. 6 Спецификатор типа.

Спецификатор Описание Выбранные символы
i, u Целые Произвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном.
d Десятичное целое Произвольное число цифр (0-9), возможно, начинающихся с + или -.
o восьмеричное целое Произвольное число цифр (0-7), возможно, начинающихся с + или -.
x Шестнадцатеричное целое Произвольное число цифр (0-F), возможно, начинающихся с + или — и префикса 0x или 0X.
f, e, g Число с плавающей точкой Число, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате.
a
c Символ Если ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце.
s Строка Считывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный.
p Адрес указателя Последовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p
[символы] Множество символов Считывает только те символы, которые записаны в квадратных скобках, С99
[^символы] Множество символов Считывает только те символы, которые не указаны в квадратных скобках, С99
n Ничего не считывает Сохраняет число уже считанных символов по указанному адресу

Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким флагом функции printf.

Кроме функций scanf и printf есть ещё ряд функций, которые позволяют получать вводимые данные

int getch() [aka _getch(), getchar()] — возвращает введённый символ, при этом не выводит его на консоль.

char * fgets ( char * str, int num, FILE * stream ) — функция позволяет считывать строку с пробельными символами. Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.

Это не полный набор различных функций символьного ввода и вывода. Таких функций море, но очень многие из них небезопасны, поэтому перед использованием внимательно читайте документацию.

Непечатные символы

В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы можно задавать в виде численных значений, либо в виде эскейп-последовательностей: символа, экранированного обратным слешем.

Таб. 7 Управляющие последовательности.

Последовательность Числовое значение Результат
\a 0x07 Звуковой сигнал
\b 0x08 Перевод каретки на одно значение назад
\f 0x0c Новая страница
\n 0x0a Перевод строки, новая строка
\r 0x0d Возврат каретки
\t 0x09 Табуляция
\v 0x0b Вертикальная табуляция
0x22 Двойная кавычка
\\ 0x5с Обратный слеш

email

Всё ещё не понятно? – пиши вопросы на ящик

Name already in use

C / Lecture 1 / lecture_1.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink

1 contributor

Users who have contributed to this file

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Темы, которые будут рассмотрены на этой лекции:

  • Функция вывода на экран. Делаем Hello World;
  • Основные типы данных: int, float, char. Переменные;
  • Базовые алгоритмические конструкции: if, if-else, for, while, do-while, switch.

Изучение любого нового языка программирования принято начинать с программы, выводящей на экран сообщение «Hello World!». Давайте же и напишем ее!

Для этого нам понадобится функция printf, описанная в заголовочном файле stdio.h (заголовочные файлы подробнее будут рассмотрены во второй лекции):

Обратите внимание на символы \n. Это т.н. эскейп-последовательность (также управляющиая последовательность — последовательность из двух символов, обозначающих один), которая говорит, что после ее считывания продолжить печатать нужно с новой строки. Вот список всех ескейп-последовательностей:

Последовательность Значение
\a подача звукового сигнала
\b возврат назад и затирание
\f прогон страницы
\n конец строки
\r возврат каретки
\t горизонтальная табуляция
\v вертикальная табуляция
\ooo восьмеричное число
\xhh шестнадцатеричное число
\ обратная косая черта
? вопросительный знак
одинарная ковычка
« двойная кавычка

Замечание: последние четыре последовательности это так называемые экранированные символы. Т.е. мы ставим обратный слеш дважды, чтобы показать, что намерены использовать именно этот символ, а не какую-то специальную последовательность, начинающуюся с него, как бы экранируя его.

Замечание 2: В ОС семейства Windows для перевода строки используется последовательность символов \r\n, в то время как в Linux — просто \n.

В конце каждой строчки ставится оператор «;», если эта строчка не начинается с директивы препроцессора типа #include. После компиляции на выходе мы получаем следующее:

Чего мы и хотели.

Форматный вывод в printf

Функция printf() может выводить не только строчки, но и значения различных констант и переменных. Для этого используются спецификаторы формата. Пример спецификатора: «%d». На месте этого спецификатора ставится целое число, которое берется из аргументов функции printf. Для понятности рассмотрим общий вид функции printf:

На месте спецификаторов появляются значения аргументов из списка arg-list.

Количество аргументов должно точно соответствовать количеству спецификаторов формата, причем следовать они должны в одинаковом порядке. Например, следующий вызов функции printf():

Приведет к выводу «Hi с 10 there!». Строка символов, выводимая на экран, отделяется от аргументов запятой. Аргументы друг от друга также отделяются запятой.

Таблица команд форматирования функции printf

Код Формат
Символ типа char
%d Десятичное число целого типа со знаком
%i Десятичное число целого типа со знаком
Научная нотация (е нижнего регистра)
Научная нотация (Е верхнего регистра)
%f Десятичное число с плавающей точкой
%g Использует код %е или %f — тот из них, который короче (при использовании %g используется е нижнего регистра)
%G Использует код %Е или %f — тот из них, который короче (при использовании %G используется Е верхнего регистра)
Восьмеричное целое число без знака
%s Строка символов
%u Десятичное число целого типа без знака
Шестнадцатиричное целое число без знака (буквы нижнего регистра)
Шестнадцатиричное целое число без знака (буквы верхнего регистра)
Выводит на экран значение указателя
%n Ассоциированный аргумент — это указатель на переменную целого типа, в которую помещено количество символов, записанных на данный момент
%% Выводит символ %

Кроме того, могут быть применнеы модификаторы типов, например: %ld — long int, %hu — short unsigned, %lf — long double.

Типы данных и переменные

Переменная в Си

Любая переменная в Си характеризуется своим именем и типом данных, которые в ней хранятся.

Имена (идентификаторы) переменных в языке С составляются из букв и цифр, причем первый символ должен быть буквой. Символ подчеркивания » _ » считается буквой. Прописные и строчные буквы различаются. В качестве имен переменных запрещается использовать ключевые слова языка программирования С.

Тип данных — это логическая, или человеческая интерпретация значений байтов, которые занимает переменная. По сути, механизм типа данных в различных языках программирования вводится, чтобы связать значения битов\байтов\слов в памяти ЭВМ с понятному каждому человеку словами «целое число», «вещественное число», «символ» и пр., с которыми компьютер не оперирует.

Простые типы данных в Си:

У каждого типа данных в Си есть две величины, которые его характеризуют:

  • количество байт, отводимых под переменную данного типа;
  • диапазон возможных значений.

В языке С для целых чисел введены следующие три модификатора:

  • short;
  • long;
  • unsigned.

Модификаторы short и long связаны с размером целых чисел.

Модификатор unsigned позволяет интерпретировать содержимое соответствующих ячеек памяти как целое число без знака. Числа без знака всегда положительны.

Пример размеров и диапазонов величин данных простых типов:

Замечание: данная таблица не является стандартом, а лишь примером. Размер типа данных может зависеть как от компилятора, так и от разрядности архитектуры компьютера. UPD: char всегда занимает один байт, short — не менее 16 бит, long — не менее 32 бит, и при этом размер short не превосходит размера int, а размер int не превосходит размер long. Схожая картина для float, double и long double: float не превосходит double, а double не превосходит float. Таким образом, из трех этих размеров различными могут быть один, два или все три.

Чтобы точно узнать количество байт, отводимых под конкретный тип данных, можно воспользоваться функцией sizeof. Например:

Целый тип данных

Собственно, название типа данных говорит само за себя. Переменная данного типа хранит в себе целые числа.

Перед использованием переменной необходимо ее объявить. Объявление в программе выглядит так:

Операции с переменными целого типа

Также в Си есть операции инкремента и декремента.

Инкремент » ++ » – это увеличение значения переменной на единицу. Декремент » — » – это уменьшение на единицу. Операции декремента и инкремента с лёгкостью заменяются арифметическими операциями или операциями присваивания. Но использовать операции инкремента и декремента намного удобнее.

При использовании операции преинкремента значение переменной сначала увеличивается на 1, а затем используется в выражении. При использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1.

Аналогично и для декремента.

В языке программирования С имеются шесть операций для манипулирования с битами. Их можно применять только к целочисленным операндам, т.е. к операндам типов char, short, int и long, знаковым и беззнаковым:

Операция & (побитовое И) часто используется для обнуления (сброса) некоторой группы разрядов. Пример:

Операция | (побитовое ИЛИ) применяется для установки определенных разрядов в 1. Пример:

Операция ^ (побитовое исключающее ИЛИ) в каждом разряде устанавливает 1, если соответствующие разряды операндов имеют различные значения, и 0 в противном случае. Пример:

Операция << выполняет сдвиг влево своего левого операнда на число битовых позиций, задаваемое правым операндом, которое должно быть положительным. Пример:

Операция >> выполняет сдвиг вправо своего левого операнда на число битовых позиций, задаваемое правым операндом, которое должно быть положительным. Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины в одних системах программирования С происходит с размножением знака («арифметический сдвиг»), на других — с заполнением освобождающихся разрядов нулями («логический сдвиг»). Пример:

(побитовое отрицание) превращает единичные биты в нулевые и наоборот (дополнениецелого до единиц по всем разрядам). Пример:

Читать:
Figmotion is currently not in focus что это

Похожие статьи