Статьи

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

Эта статья является последней в серии «Операторы в C», после « Операторы в C», часть 3 . Здесь будут обсуждаться остальные операторы. Следующая категория – это операторы равенства, тесно связанные с операторами отношений.

Операторы равенства

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

1. Равен (==)

2. Не равно (! =)

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

а. Оба операнда должны быть арифметического типа.

б. Оба операнда должны иметь тип указателя.

Два указателя сравниваются равными, если:

а. Оба являются нулевыми указателями.

б. Оба указателя на один и тот же объект или функцию.

с. Оба указателя на один за последним элементом одного и того же объекта массива.

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

Побитовое И, Побитовое Исключающее ИЛИ и Побитовое Включающее ИЛИ Операторы

Существует три логических побитовых оператора: побитовое И ( & ), побитовое исключающее ИЛИ ( ^ ) , побитовое включающее ИЛИ ( | ) . Каждый из этих операторов требует два операнда целочисленного типа. Операции выполняются независимо для каждой пары соответствующих битов в операндах. Таким образом, младшие значащие биты (то есть самые правые биты) в двух операндах будут сравниваться первыми, затем следующими младшими значащими битами и т. Д., Пока все биты не будут сравнены. Результаты этих сравнений:

  • Битовое выражение AND вернет 1, если оба бита имеют значение 1 (т. Е. Если оба бита имеют значение true), в противном случае оно вернет значение 0.
  • Битовое исключающее выражение ИЛИ вернет 1, если один из битов имеет значение 1, а другой имеет значение 0 (т. Е. Если один бит – истина, а другой – ложь), в противном случае он вернет значение 0.
  • Битовое включающее выражение ИЛИ вернет 1, если один или оба бита имеют значение 1 (т. Е. Если один или оба бита имеют значение «истина»), в противном случае оно вернет значение 0.

Пример: предположим, что ab

a = 0110 1101 1011 0111

b = 1010 0111 0010 0110

____________________

Тогда   a&b = 0010 0101 0010 0110 

Опять же, a^b = 1100 1010 1001  0001 

Кроме того,   a|b = 1110 1111 1011 0111

Логические И, Логические ИЛИ Операторы

Операторы логического И (&&) и логического ИЛИ (||) действуют на операнды, которые сами являются логическими выражениями. Конечный эффект заключается в объединении отдельных логических выражений в более сложные условия, которые являются истинными или ложными .

Операнды логического выражения И и логического выражения ИЛИ должны иметь скалярный тип (арифметические типы и типы указателей). Результат выражения логического И и выражения логического ИЛИ имеет тип  int

Логический оператор AND && должен выдавать 1, если оба его операнда сравниваются с неравным 0 (т.е. оба операнда имеют значение true); в противном случае он возвращает 0. Если первый операнд сравнивается равным 0 (т. е. если первый операнд является ложным), второй операнд не оценивается. Это связано с тем, что в отличие от побитовых операторов операнды логического выражения оцениваются слева направо.

Пример. Предположим, что i3 c w Тогда в выражении ((i> = 6) && (c == ‘w’)); поскольку первый операнд (i>=6)

Логическое ИЛИ || оператор должен выдавать 1, если один из его операндов сравнивается с неравным 0 (т. е. если один из операндов истинен); в противном случае он возвращает 0.

Условный оператор (? 🙂

Условный оператор (? 🙂 является троичным оператором, т. Е. Он требует трех операндов. Простые условные операции могут выполняться с условным оператором. Выражение, в котором используется условный оператор, называется условным выражением. Такое выражение может быть записано вместо оператора if / else (который будет обсуждаться в следующей статье).

Условное выражение записывается в виде:

выражение1? выражение2: выражение3

При оценке условного выражения expression1 вычисляется первым. Если expression1 равно true, тогда expression2 выполняется, иначе expression3 выполняется.

Если expression1 имеет значение true, выражение2 оценивается, и оно становится значением условного выражения, иначе выражение3 оценивается, и оно становится значением условного выражения. Определенное таким образом значение условного выражения может быть присвоено переменной и использовано позже в программе. Условные выражения часто появляются в правой части простого оператора присваивания. Полученное значение условного выражения присваивается идентификатору слева.

Пример 1. Предположим, что iflag Рассмотрим следующее условное выражение:

(i<0)? 0:100;

Выражение (i<0) Если оно истинно (т.е. я меньше 0), все условное выражение принимает значение 0 В противном случае все условное выражение принимает значение 100 Определенное таким образом значение условного выражения может быть присвоено переменной и использовано позже в программе. Это иллюстрируется следующим утверждением:

flag= (i<0)? 0:100;

Если i0flag 0100

Пример 2: Пусть a bmax Следующее условное выражение определяет большее значение путем сравнения a и b и присваивает ему значение max:

max=(a>b)?a:b;

Операторы присваивания

В Си есть несколько различных операторов присваивания. Они используются для формирования выражений присваивания , которые присваивают значение выражения идентификатору. Наиболее часто используемый оператор присваивания – это простой оператор присваивания (=). Выражения присваивания, которые используют этот оператор, записываются в форме:

идентификатор = выражение

где идентификатор представляет переменную, а выражение представляет константу, переменную или более сложное выражение.

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

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

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

Несколько назначений формы

Identifier1 = identifier2 = … .. = выражение

допустимы в C. Поэтому множественное назначение

идентификатор1 = идентификатор2 = выражение

эквивалентно

идентификатор1 = (идентификатор2 = выражение)

Например, в утверждении i=j=5; где ij5j i Таким образом, обеим переменным присваивается значение 5

Составные Задания

C содержит следующие составные операторы присваивания:

+ = – = * = / =% = >> = << = & = ^ = | =

Выражение с использованием составного оператора присваивания принимает форму:

выражение1 оператор = выражение2

Чтобы увидеть, как они используются, рассмотрим оператор присваивания + =. Выражение присваивания

выражение1 + = выражение2

эквивалентно

выражение1 = выражение1 + выражение2

Например:

a+=2;

эквивалентно

a=a+2;

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

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

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

Оператор запятой

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

Использование запятой в качестве оператора отличается от ее использования в вызовах функций, объявлениях переменных, инициализации и т. Д., Где она используется в качестве разделителя.

Следующий пример иллюстрирует использование оператора запятой:

Пусть resultai Рассмотрим следующие выражения:

i=2,a=3;

result = (i+=2,i+a);

В первом утверждении i=2,a=3; запятая используется в качестве разделителя. Во втором операторе оператор запятой сначала увеличивает значение i2 a(3)i(4) Значение, сохраненное в переменной resulti+a,7 Если убрать скобки, значение переменной result будет 4 Это связано с тем, что приоритет оператора присваивания выше, чем оператора запятой. Таким образом, будет оцениваться только первый операнд i+=2result Использование скобок повышает приоритет оператора в скобках.

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

Приоритет оператора

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

Приоритет Операторская группа Ассоциативность

1 Постфиксные операторы слева направо

2 префиксных оператора справа налево

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

4 Аддитивных оператора слева направо

5 битовых операторов сдвига слева направо

6 реляционных операторов слева направо

7 операторов равенства слева направо

8 битовых операторов слева направо

9 логических операторов слева направо

Условный оператор слева направо

11 Операторы присваивания справа налево

12 оператор запятой слева направо

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