Главная » Статьи » Программирование » С/С++

Операции языка С

Операции языка С

 

Для формирования выражений используются операции.

В таблице 1 приведены знаки операций, определеные стандартом языка С. наивысшим приоритетеом обладают операции с рангом 1.

 

Таблица 1

Ранг

Операции

Ассоциативность

1

()   []   ->   .

2

!   ~   +   -   ++   --   &   *    (тип)      sizeof

3

*   /   %   (мультипликативные бинарные)

4

+   -   (аддитивные бинарные)

5

<<   >>   (поразрядного сдвига)

6

<   <=   >=   >   (отношения/сравнения)

7

==   !=   (отношения/сравнения)

8

&   (поразрядная конъюнкция И)

9

^   (поразрядное исключающее ИЛИ)

10

|   (поразрядная дизъюнкция ИЛИ)

11

&&   (конъюнкция И)

12

||   (дизъюнкция ИЛИ)

13

?:   (условная операция)

14

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

15

,   (операция “запятая”)

 

Опреации одного ранга имеют одинаковый приоритет. Если их несколько в выражении, то они выполняются в соответствии с правилаими ассоциативности: либо слева направо (→), либо справа налево (←).

 

Если один и тот же знак операции приведен в таблице дважды (например, знак *), то его первое появление (с меньшим по номеру, то есть старшим по приоритету рангом) соответствует унарной операции, а второе – бинарной.

 

Для каждой операции языка С определено количество операндов:

  • один операнд – унарная операция (например, унарный минус –x, изменяющий знак);
  • два операнда – бинарная операция (например, операция сложения x+y);
  • три операнда – операция условие  ?:  , – такая операция одна (рассмотрим ее позже).

 

Каждое выражение имеет определенное значение, а, следовательно, определенный тип этого выражения.

Каждая операция может иметь только определенные типы операндов. Например, оперция побитового сдвига определена только для целочисленных операндов.

Каждая бинарная операция также имеет определенный порядок выполнения – слева направо или справа налево. В частности, операция присваивания выполняется справа налево, а операция сложения – слева направо.

 

Арифметические операции

 

Арифметические операции:

 

-   унарный минус;

+  сложение;

*   умножение;

/   деление;

%   деление по модулю;

++   увеличение на единицу (increment);

--   уменьшение на единицу (decrement).

 

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

Если операнды имеют один тип, то и результат арифметической операции имеет тот же тип. Поэтому, когда операция деления  /  применяется к целым переменным или символьным переменным, то остаток отбрасывается. Например, выражение 13/5 равно 2, а выражение 2/3 равно 0.

 

Операция деления по модулю  %  дает остаток от целочисленного деления. Эта операция может применяться только к целочисленным переменым.

 

Операции ++   и   --   имеют 2 формы :

  • префиксную ++x  (--x) – значение переменной  x  сначала используется в выражении, и лишь затем переменная увеличивается (уменьшается) на единицу;
  • постфиксную x++   (x--)– перемення  x  сначала увеличивается (уменьшается) на единицу, а затем ее значение используется в выражении.

 

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

 

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

 

Операции отношения используются для сравнения:

<   меньше;

<=   меньше или равно;

>   больше;

>=   больше или равно;

==   равно;

!=   не равно.

 

В языке С имеется также три логические операции:

&&   И (AND)

||        ИЛИ (OR)

!        НЕ (NOT).

 

Операции отношения используются в условных выражениях (условиях).

 

В языке С нет знака логической операции «исключающее ИЛИ»  XOR, хотя она может быть реализована с помощью операций AND, OR или NOT. Однако в побитовых операцияъ такая операция есть.

 

Операции отношения и логические операции имеют приоритет ниже, чем арифметические операции, поэтому выражение  20  <  18+5  рассматривается как выражение  20 <  (18+5).

 

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

Результат использования этих операций целочисленный – 0 (false- ложь)  или 1 (true- истина).

 

Примеры

 

5 < 7    равно 1

7==9  равно  0

 

А теперь вычислите результаты применения указанных операций к следующим выражениям:

 

7!=8 ||  20==13    

2+3>4 &&  10-7 <= 4  &&  5 >= 1+2

 

Операция присваивания

 

Эта операция обозначается знаком  = .

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

Так, в строке кода

if ((f=x-y))  printf(“число  x   больше  y”)

сначала вычисляется величина  x-y, которая присваивется переменной f, а затем ее значение сравнивается с нулем.

 

Еще одной особенностью применения операции присваивания – это возможность записать оператор:

a=b=c=x*y;

Подобное многократное приваивание выполняется справа налево. Сначала вычисляется выражение x*y, а затем полученное значение присваивается  c, потом  b  и лишь потом  a.

В левой части оператора присваивания должно стоять выражение, которому можно присвоить значение. Такое выражение в языке С, например просто переменная, называется величиной  lvalue.

Например, выражение 5=5 ошибочно, так как константе нельзя присвоить никакое значение, – константа не является величиной lvalue.

 

В языке С существуют дополнительные операции присваивания (их часто называют составными операциями присваивания) :  +=,  -=,  *=,  /=  и  %= .

 

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

Здесь  +=  аддитивная операция присваивания, в результате выполнения которой величина, стоящая справа, прибавляется к значению переменной, стоящей слева.

 

Побитовые операции

 

Побитовые операции можно проводить с любыми целочисленными перемеными и константами.

Результатом побитовой операции будет целочисленное значение.

 

Нельзя использовать эти операции с переменными типа float, double  и  long double.

 

Побитовыми (поразрядными) операциями являются:

 

 

&   AND

|   OR

^   XOR

~   NOT

<<    сдвиг влево

>>   сдвиг вправо

 

Первые 4 операции аналогичны соответствующим логическим операциям. Только в этом случае мы сравниваем не зачения выражений, а значения каждой соответствующей пары разрядов (битов).

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

 

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

 

Побитовые операции удобны, в частности, для хранения в сжатом виде информации о состоянии on/off  (включении/выключении). В одном байте можно хранить 8 таких флагов.

 

Если переменная ch является хранилищем таких флагов, то проверить, находится ли ли флаг, содержащийся в третьем бите, в состоянии on, можно следующим образом:

 

if (ch &  4) printf(“3 бит содержит 1, состояние  on”);

 

Это проверка основана на двоичном представлении числа 4 (00000100).

 

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

 

Пример.

unsigned chsr x=255;

В двоичном представлении x=11111111.

Так, значением выражения x=x<<4 в двоичном виде будет 11110000.

 

К побитовым операциям относят также :

 

  • |=   присваивание после поразрядной дизъюнкции – присвоить целочисленному операнду левой части значение, полученное поразрядной дизъюнкцией (ИЛИ) его битового представления с битовым представлением целочисленного операнда правой части  x |= y эквивалентно x=x | y.

 

  • &=   присваивание после поразрядной конъюнкции – присвоить целочисленному операнду левой части значение, полученное поразрядной конъюнкцией (И) его битового представления с битовым представлением целочисленного операнда правой части  x &= y эквивалентно x=x |&y.

 

  • ^=  присваивание после исключающего поразрядного ИЛИ – присвоить целочисленному операнду левой части значение, полученное применением поразрядной операцуии исключающего ИЛИ к битовым представлениям значений обоих операндов  z^=x+y эквивалентно z=z^(x+y).
  • <<= и  >>=   присваивание после сдвигов – присвоить целочисленному операнду левой части значение, полученное сдвигом соответственно влево или вправо енр битового представления на количество разрядов, равное значению правого целочисленного операнда.

 

Условная трехместная операция

 

Это единственная операция, имеющая три операнда.

Эта операция имеет вид:

(выр1)?(выр2):выр3)

Вычисляется выражение (выр1). Если это выражение имеет ненулевое значение, то вычисляется выражение (выр2). Результатом операции будет выражение (выр2).

Если значение выражения (выр1) равно нулю, то вычисляется выражение (выр3), и его значение будет результатом операции. В любом случае вычисляется только одно из выражений: (выр2) и (выр3).

 

Пример. Найти наибольшее из двух чисел x и y.

(x>y) ? x : y;

или

max=(x<=y) ? y : x;

Пример. Вычисление абсолютной величины переменной x можно организовать с помощью одной операции:

x<0 ? -x : x;

Пример. Заменить большее значение из двух переменных x и y на единицу:

(x > y) ? x: y = 1;

Правила языка в данном случае позволяют ставить условную операцию слева от знака присваивания.

 

 

Унарные (одноместные) операции

 

 

&  операция получения адреса операнда;

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

–   унарный минус – меняет знак арифметического операнда;

+   унарный плюс (аналогично).

~  поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента – побитовое отрицание (инверсия);

!   НЕ – логическое отрицание значения операнда. Целочисленный результат 0, если операнд ненулевой (то есть истинный) или 1, если операнд нулевой (ложный).

Например,   !(-7) равно 0  или !0 равно 1.

++ и  --     операции инкремента и декремента;

 

Операция sizeof – эта операция имеет 2 формы:  sizeof(тип) или sizeof(выражение).

 

Результатом операции sizeof  является целочисленное значение величины типа или выражения в байтах. При использовании второй формы значение выражения не вычисляется, а лишь определяется его тип.

 

Примеры

sizeof(short int)

sizeof(x).

 

 

 

 

 

 

 

 

Категория: С/С++ | Добавил: Алексей (05.10.2014)
Просмотров: 529 | Теги: операции языка С, Язык, С++, программирование, операции | Рейтинг: 0.0/0
Всего комментариев: 0
avatar