1.4. Операции. Выражения

В языке С определены следующие операции:

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

унарный +, унарный сложение +, вычитание - , умножение *, деление /, ос­таток от деления %, инкремент ++, декремент --. Операция / определена как для вещественных операндов, так и для целых, но для целых операндов результат всегда целый и равен целой части частного. Инкрементная и декрементная опе­рации применимы только к переменным, выражение x++ эквивалентно выраже­нию x=x+1 . Возможны постфиксная и префиксная формы этих операций. При использовании префиксной формы значение переменной изменяется до его под­становки в выражение, а при использовании постфиксной формы - после вычис­ления выражения. Например, пусть переменная x описана как int x=5; тогда зна­чение выражения ++x*2 будет равно 12, а значение выражения x++*2 равно 10, значение переменной в обоих случаях станет равным 6.

б) операции сравнения:

равно == , не равно != , больше > , больше либо равно >= , меньше < , мень­ше либо равно <= . Результат операции сравнения есть целое число 0 или 1.

в) логические операции:

отрицание ! , логическое "и" && , логическое "или" ||. При вычислении ло­гических выражений любое ненулевое значение считается истинным, результат логической операции - целое число 0 или 1. Таким образом, логические операции применимы к любым скалярным величинам, в языке С вообще нет специального типа данных для логических, или булевских, величин. Логические выражения всегда вычисляются только до получения результата; так в выражении x!=2||1/x>3 при x=0 не произойдет ошибки, т.к. выражение 1/x не будет вычис­ляться.

г) операция sizeof:

sizeof ( тип ) или sizeof выражение . Результат операции - размер объекта в байтах, тип результата всегда unsigned. В языке PASCAL эта операция реализована встроенной функцией SizeOf.

д) операция явного преобразования типа:

( тип ) выражение

Если операнды некоторого выражения имеют разный тип, то они автомати­чески приводятся к одному (старшему) типу. Старшинство типов возрастает в такой последовательности : char < unsigned char < int < unsigned < long < float < double .

е) битовые операции:

побитовое отрицание ~ , побитовое "и" & , побитовое исключающее "или" А , побитовое "или"  | , сдвиг битов влево << , сдвиг битов вправо >> .

Битовые операции применимы только к целым операндам, все они имеют аналоги в языке PASCAL : ~ = NOT, & = AND, а = XOR, | = OR, << = ShL, >> =

ShR.

ж) операции присваивания:

в отличие от языка PASCAL в языке С конструкция, состоящая из двух опе­рандов и операции присваивания, является выражением, его значение равно зна­чению, полученному переменной в левой части выражения. Кроме обычной опе­рации присваивания = существует еще 10 операций: += , -=, *= , /= , %= , <<= , >>= , &= , а= , |= , смысл которых очевиден из простейшего примера : x+=a оз­начает x=x+a.

з) операция адрес:

& переменная

Эта унарная операция применима только к переменным, ее аналог в языке PASCAL - операция @.

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

Приоритеты операций определены следующим образом:

унарные операции > {*, /, %} > {+, -} > {<<, >>} > {>, >=, <, <=}> {==, !=} > & > Л > | > && > || > операции присваивания > операция "запятая".

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