- •1.Основные компоненты программного обеспечения и их связь с аппаратурой. Ретроспектива развития программирования.
- •2 Этапы решения задач на эвм
- •3 Основные типы данных и структуры данных в программировании
- •3.1.1 Арифметические типы
- •3.1.2 Логический тип
- •3.1.3 Символьный тип
- •4 Методы решения задач программирования
- •5 Разработка алгоритмов Пример 5.8
- •Пример 5.9
- •Пример 5.10
- •6 Кодирование алгоритмов на языке си
- •- Семантические;
- •Тело директивы
- •Имя аргумента
- •Оператор
- •6.4.1 Имена переменных Имена переменных могут состоять из букв (только из латинского алфавита), цифр и символа подчеркивания, приравненного к букве. Начинаться имя должно с буквы.
- •Пример 6.3:
- •6.4.2 Типы и размеры данных
- •6.4.3 Константы
- •Пример 6.4:
- •Пример 6.5:
- •Пример 6.6:
- •Пример 6.7:
- •Пример 6.8:
- •7 Декларации в си
- •8 Операторы в языке си
- •9 Управление в си
- •10 Указатели и массивы
- •Литерные указатели
- •11 Структуры в языке си
- •Структуры, вложенные друг в друга
- •Пример 11.10
- •12 Функции и структура программы
- •Аппарат формальних і фактичних аргументів Приклад 12.4
- •Опис прототипу функції
- •Приклад 12.5
- •13 Передача аргументов
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);