Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций_2015.doc
Скачиваний:
36
Добавлен:
03.03.2016
Размер:
532.48 Кб
Скачать

8 Операторы в языке си

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

В языке Си привычные знаки операций называют операторами, а конструкции языка (ветвления, циклы) называют инструкциями.

Свойства операторов:

  • арность (количество операндов);

  • позиция (место по отношению к операндам);

  • приоритет (важность, старшинство);

  • ассоциативность (порядок выполнения операторов с олинаковым приоритетом).

1.Операторы +, -, / , * , % бинарные.( % - остаток от деления)

Оператор

Целые

Вещественные

+

Сложение

Сложение

-

Вычитание

Вычитание

*

Умножение

Умножение

/

Деление нацело

Деление нацело

%

Остаток от

Деления

--------------------

Пример 8.1:

year%4

Приоритет:

prio(+) = prio(-)

prio(*) = prio (/) = prio(%)

prio(*, /, %) > prio(+, -)

Для унарных +, - :

prio(унарных)>prio(*, /, %)

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

Ассоциативность определяет порядок выполнения операторов с одинаковым приоритетом. Все арифметические операторы левоассоциативные.

Пример 8.2:

8/2/2  4/2=2

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

Бинарные операторы:

1) отношения:>,>=,<,<= (одинаковый приоритет);

2) сравнения на равенство:

==(равно) !=(неравно)

Приоритет одинаковый внутри группы.

prio(отношения)>prio(сравнения на равенство)

prio(отношения)<prio(арифметических)

Пример 8.3:

K+1<l+2 (k+1)<(l+2)

Year%4==0 (Равен ли остаток от деления year на 4 0 ?)

Все операторы сравнения и отношения вырабатывают значение истина и ложь. В языке Си:

  • ложь – 0

  • истина - ≠ 0

  • 8.3Логические операторы

8.3.1 Бинарные операторы:

&&- логическое ‘и’

|| - логическое ‘или’

Вычисление результата логического выражения выполняется до тех пор, пока не вычислится истинность выражения (слева на право).

Результат && есть “ложь”, как только первый попавшийся операнд есть “ложь”. Результат || есть “истина”, как только первый попавшийся операнд -“истина”.

Дальше вычисление не производится.

Свойства:

&& и || -левоассоциативные

prio(&&) = prio(||)

prio(&&) <prio (отношения, сравнения на равенство)

X&&Y

X Y

И

Л

И

И

Л

Л

Л

Л

X||Y

X Y

И

Л

И

И

И

Л

И

Л

Пример 8.4:

4 3 2 6 5 1 8 7 (приоритет)

Year%4==0&&year%100!=0||year%400==0

8.3.2 Унарный оператор

Логическое отрицание

не - !

0,если х ≠0

!х=

1,если х=0

prio(!)>prio(&&,||)

Пример 8.5:

Эквивалентны:

res==0 и !res

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

Применяется к целочисленным операндам (char, short, int, long) знаковым и без знаковым.

8.4.1 Бинарные

8.4.1.1 Побитовое И

& : используют для обнуления разрядов или бита внутри байта

X&Y

X Y

1

0

1

1

0

0

0

0

Пример 8.6:

Значение выражения содержит 1 Maska1=017;

во всех разрядах, в которых ie1 и ie2 P=p&maska1;

содержит 1 и 0 во всех остальных разрядах

8.4.1.2 Побитовое ИЛИ

| : для установки разрядов в 1

X||Y

X Y

1

0

1

1

1

0

1

0

Пример 8.7:

Значение выражения содержит 1 Maska2=03;

во всех разрядах, в которых ie1 или ie2 m=m&maska2;

содержит 1 и 0 во всех остальных разрядах

Следует отличать логические и побитовые операторы !!!

Пример 8.8:

X=1; y=2;

x&&y /*=1*/

x&y /*=0*/

8.4.1.3 Побитовое исключающее ИЛИ

^ : 1- разные значения

0- остальные разряды

X ^ Y

X \ Y

1

0

1

0

1

0

1

0

Пример 8.9:

x=0177;

y=01;

x^y /*0176*/;

8.4.1.4 Сдвиг влево

<< - правый операнд должен быть >0

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

Пример 8.10

x=02; /*0102*/

y=x<<1; /*01002=4*/

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

8.4.1.5 Сдвиг вправо

>> - правый операнд должен быть >0

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

Пример 8.11

x=06; /*1102*/

y=x>>1; /*112=3*/

z=x>>2; /*12*/

Сдвиг вправо соответствует делению нацело на степень двойки.

8.4.2 Унарные

Унарный оператор побитового отрицания ~

x

~x

0

1

1

0

Пример 8.12

c=c&~03;

Значение выражения :

0

0

C_1 ……………………………………С_14 С_15 С_16

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

Операторы присваивания имеют следующий вид

<e1><op>=<e2> - выражение

<op> - бинарный оператор

+ % << |

- >> ^

* &

/

Выполнение

<e1>=<e1><op><e2>

значки операторов присваивания

+= /= <<= &= ^=

-= %= >>= |=

Пример 8.14

x=15; x8=015;

y=8; y8=07;

z=5; z8=05;

x+=2; /*x=17*/

y-=7; /*y=1*/

z*=4; /*z=20*/

z/=2; /*z=10*/

z%=3; /*z=1*/

x8<<=2; /*x8=064*/

y8>>=1; /*y8=3*/

x8|=03; /*x8=067*/

x8^=07; /*x8=060*/

!!! Внимание !!!

x*=a+b ( x=x*(a+b)

( x=x*a+b;

Все операторы правоассоциативные.

8.6 Инкрементные и декрементные операторы

Унарные

инкрементный ++ : добавляет 1 к операнду;

декрементный -- : вычитает 1 из оператора

необычность

префиксный ++(--) увеличивает (уменьшает) операнд до его использования

постфиксный ++(--) увеличивает (уменьшает) операнд после его использования

Пример 8.15:

x=2;

y=x++; /*y=x; x+=1;

y=2; x=3*/

x=2;

z=++x; /*x+=1; z=x;

x=3; z=3*/

Эти операторы можно применять только к переменным, но не к выражениям.

8.7 Преобразование типов

Преобразование (приведение) типов: приведение операндов разных типов к некоторому общему.

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

1) Для бинарных операторов:

а) если 1 из операндов имеет тип long double, то операнды приводятся к типу long double;

б) если 1 из операндов имеет тип double, то общий тип – double;

в) если 1 из операндов имеет тип float, то общий тип - float;

г) если 1 из операндов имеет тип short или int, то общий тип – int; (для целочисленных операндов);

д) если 1 из операндов имеет тип long, то общий тип – long, то общий тип- long (для целочисленных операндов).

2) При присваивании:

значение правой части приводится к типу левой части, это и будет типом результата.

а) char -> int (размножение знака)

б) int -> short

int -> char

long -> int

long -> char

(отбрасывание старших разрядов)

в) float -> int

int -> float

(преобразование типа с ПТ <-> целое)

г) double -> float (округление/отбрасывание)

3) При вызове функций (будет рассмотрено в соответствующей теме)

4) Явное задание приведения типов

Когда ни одно из вышеуказанных правил не выполняется, то используется оператор <тип>, который задаёт явное преобразование к явному типу данных.

  • унарный;

  • префиксный;

  • правоассоциативный

Синтаксис:

(<имя_типа>) е,

где е – выражение

Семантика:

<е> приводится к заданному <типу>

Пример 8.19:

int x=16;

y=sqrt((double)x);