Статьи

Операторы в Си, часть 3

Эта статья является продолжением учебника Операторы в C Часть 2 . Здесь будут обсуждаться следующие унарные операторы, оператор приведения, мультипликативные и аддитивные операторы, операторы побитового сдвига и реляционные операторы.

Унарные арифметические операторы

Есть четыре унарных арифметических оператора:

1. Одинарный минус (-)

2. Унарный плюс (+)

3. Побитовое дополнение (~)

4. Оператор логического отрицания (!)

Унарный минус оператор

Унарный оператор минус предшествует числовой константе, переменной или выражению и отрицает ее значение. Он отличается от оператора вычитания (-), который требует двух отдельных операндов.

Операнд унарного минусового оператора должен принадлежать области арифметического типа данных . Область арифметического типа состоит из типов данных Integer и типов данных с плавающей точкой. Типы данных Integer состоят из типов charsigned unsigned integer types enumerated typesfloat and double Типы с плавающей точкой — это типы с int Каждый из этих арифметических типов принадлежит одному типу доменов — реальный тип (хранит значения, которые являются действительными числами) или комплексные типы (хранит значения, которые являются комплексными числами).

Унар Плюс Оператор

Унарный оператор плюс также предшествует числовой константе, переменной или выражению. Результатом унарного (+) оператора является значение его операнда. Операнд унарного (+) оператора также должен принадлежать области арифметического типа.

Оператор побитового дополнения

Оператор побитового дополнения (~) приводит к инвертированию или обращению битов; то есть 1 становятся 0 и 0 становятся 1. Операндом должно быть количество целочисленных типов (целочисленные типы со знаком, со знаком и без знака и перечисляемые типы).

Оператор логического отрицания

Оператор логического отрицания (!) Отрицает значение логического выражения; то есть, это вызывает выражение, которое первоначально истинно, становится ложным, и наоборот. Результат оператора логического отрицания имеет тип i=7 Результат ! равно 0, если значение операнда, которое является логическим выражением, не равно 0, а результат равен 1, если значение операнда равно 0.

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

Пример: предположим, что i и f являются целочисленными переменными, где f=5(i>f)sizeof(operand); то есть! (i> f) оценивается как 0 (ложь).

Размер и выравнивание операторов

Оператор sizeof возвращает память, занятую его операндом в байтах. Операндом может быть либо выражение, либо имя типа данных.

Синтаксис: char

Тип данных может быть одним из целочисленных типов, типом указателя или даже структурой или типом объединения. Когда sizeof применяется к операнду с типом signed charunsigned charsize_t Если он применяется к структуре / объединению, результатом является сумма количества байтов, требуемого каждым членом структуры / объединения. Значение результата определяется реализацией, а его тип (целочисленный тип без знака) — stddef.h  _Alignas

Оператор alignof возвращает требуемое выравнивание его типа операнда. Выравнивание — это определенное реализацией целочисленное значение, представляющее количество байтов между последовательными адресами, по которым данный объект может быть выделен. Тип данных объекта накладывает требование выравнивания на каждый объект этого типа. Более строгое выравнивание можно запросить с помощью alignof(max_align_t)alignof(max_align_t)

Фундаментальное выравнивание меньше или равно наибольшему выравниванию, поддерживаемому реализацией (целевой компьютер / платформа), которое равно size_t

Расширенное выравнивание больше, чем alignof Это зависит от реализации, поддерживается ли расширенное выравнивание или нет.

Выравнивания представлены в виде значений типа (data type) expression Допустимые выравнивания включают только те значения, которые возвращаются выражением i Каждое действительное значение выравнивания должно быть целой степенью двойки.

Операторы sizeof и alignof нельзя применять к выражению, имеющему тип функции или неполный тип данных (например, тип void или массив переменной длины), к названию в скобках такого типа или выражению, которое обозначает член битового поля.

Оператор броска

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

f

Этот тип строительства известен как бросок .

Пример. Предположим, что (i+f)%4% Выражение  ((int) (i+f))%4  a Однако выражение 0110 1101 1011 0111 Таким образом, вывод этого выражения равен 3, так как оператор% дает остаток после целочисленного деления. Обратите внимание, что явная спецификация типа применяется только к первому операнду, а не ко всему выражению.

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

Мультипликативные операторы

Есть три мультипликативных оператора:

Оператор умножения (*)

Оператор * дает произведение двух операндов. Операнды должны иметь арифметический тип данных.

Оператор деления (/)

Оператор / производит частное после деления первого операнда на второй. Два операнда должны быть арифметического типа, а второй операнд должен быть ненулевым.

Оператор модуля (%)

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

Аддитивные операторы

В C есть два аддитивных оператора:

Оператор сложения (+)

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

Оператор вычитания (-)

Оператор — вычитает второй операнд из первого и выдает разницу. Для вычитания типы данных операндов должны удовлетворять одной из следующих комбинаций:

1. Оба операнда должны быть арифметического типа.
2. Оба операнда должны быть указателем на полный тип объекта.
3. Левый операнд должен быть указателем на полный тип объекта, а правый операнд должен быть целочисленным.

Операции над указателями будут обсуждаться, когда мы обсудим указатели в следующей статье.

Битовые операторы сдвига

Два побитовых оператора — сдвиг влево (<<) и сдвиг вправо (>>) . Каждый оператор требует два операнда. Первый — это операнд целочисленного типа, который представляет битовую комбинацию, которую нужно сместить. Второе — это целое число без знака, которое указывает количество смещений (т. Е. Будут ли смещены биты в первом операнде на 1-битную позицию, 2-битную позицию, 3-битную позицию и т. Д.). Это значение не может превышать количество битов, связанных с размером слова первого операнда.

Оператор сдвига влево вызывает смещение всех битов в первом операнде влево на количество позиций, указанных вторым операндом. Крайние левые биты (т.е. биты переполнения) в исходной битовой комбинации будут потеряны. Самые правые позиции битов, которые становятся свободными, будут заполнены нулями.

Пример. Предположим, что целая переменная без знака имеет значение b = a<<6 Выражение

 a

сместит все биты bb Поэтому результирующее значение 0110 1101 1100 0000a Все биты, изначально назначенные для 0110 11, Самые левые 6 битов, т. a

Оператор сдвига вправо вызывает смещение всех битов в первом операнде вправо на количество позиций, указанных вторым операндом. Самые правые биты (т. Е. Биты недостаточного потока) в исходной битовой комбинации будут потеряны. Если смещаемая комбинация битов представляет целое число без знака, то крайние левые позиции битов, которые становятся свободными, будут заполнены нулями.

Пример. Предположим, что целая переменная без знака имеет значение 0110 1101 1011 0111 Выражение

b= a>>6

сместит все биты ab Поэтому полученное значение b0000 0001 1011 0110 Самые правые 6 битов, то есть 11 0111,  Самые левые 6-битные позиции заполнены нулями.

Операторы отношений

В C есть четыре реляционных оператора:

1. Меньше чем (<)

2. Больше чем (>)

3. Меньше или равно (<=)

4. Больше или равно (> =)

Реляционные операторы используются для формирования логических выражений, которые представляют собой условия, которые являются истинными или ложными. Полученные выражения будут иметь тип integer, поскольку true представлен целочисленным значением 1, а false — 0.

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

Когда сравниваются два указателя, результат зависит от относительного расположения в адресном пространстве указанных объектов. Если два указателя указывают на один и тот же объект или оба указывают один за последним элементом одного и того же массива, они сравниваются одинаково. Если указанные объекты являются членами одной и той же структуры / объединения, указатели на элементы структуры, объявленные позже, сравниваются больше, чем указатели на элементы, объявленные ранее в структуре, а указатели на элементы массива с большими значениями нижнего индекса сравниваются больше, чем указатели на элементы того же элемента. массив с нижними значениями индекса. Все указатели на члены одного и того же объекта объединения сравниваются одинаково.

Пример: предположим, что i ji=3j=5 Тогда логическое выражение i>j(i+5)>=j

Следующая статья о C будет продолжена с остальными операторами: операторы равенства, побитовое И, побитовое ИЛИ, логическое И, логическое ИЛИ, условные операторы, операторы присваивания и оператор запятой.