111.07K
Категория: ПрограммированиеПрограммирование

Декларации в Си

1.

Лекция 30.09
Пи20аб

2.

ДЕКЛАРАЦИИ В СИ
В Си переменные надо объявлять до первого
использования.
Декларация:
1) специфицирует тип;
2) содержит список переменных этого типа;
3) возможна начальная инициализация;
4) возможен квалификатор константы (const).

3.

Инициализация – это установка начальных
значений
одновременно
с
объявлением
переменной.
Пример 14.
int step;
int up, down;
char c, str[101];
float eps=1.0e-3;
char error[]=”Ошибка: ”;
int kdm[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31};

4.

Квалификатор
декларацией.
const
записывается
перед
Его используют для того, чтобы запретить
возможность
изменения
значения
этой
переменной в программе.
Пример 15.
const float pi=3.1415;
const int kdm[12]= {31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31};

pi=3.14;
/*нельзя*/
kdm[1]=kdm[1]+1;
/*нельзя*/

5.

ОПЕРАТОРЫ В ЯЗЫКЕ СИ
В языке Си термин «оператор» обозначает
элементарное действие (операцию): +, /, <, >, =
и т.д.
1. Арифметические операторы
Свойства операторов:
- арность (количество операндов);
- позиция (место по отношению к операндам);
- приоритет (важность, старшинство);
-
- ассоциативность
(порядок
выполнения
операторов с одинаковым приоритетом).

6.

Арность

это
количество
участвующих в операции.
операндов,
Различают операции унарные (с одним
операндом), бинарные (с двумя операндами),
операторы с арностью > 2.
Операторы «+», «–» - бывают
бинарные.
унарные и
Операторы «*», «/» - бинарные.
Оператор «%» - бинарный, применим только к
целым числам.

7.

Позиция определяет место
отношению к операндам.
оператора
по
Различают:
- инфиксные (оператор записывается между
операндами). Например: 3+2;
- префиксные (оператор записывается перед
операндом). Например: -8 (изменение знака);
- постфиксные (оператор записывают после
операнда). Например: a++ (инкремент).

8.

Приоритет (старшинство) – это относительное
число, которое показывает порядок выполнения
операторов в выражении.
Зная приоритет операторов, мы можем не
записывать
лишние
круглые
скобки
в
выражениях.
prio(+) = prio(-)
prio(*) = prio (/) = prio(%)
prio(*, /, %) > prio(+, -)
prio(унарных) > prio(*, /, %).

9.

Ассоциативность
определяет
порядок
выполнения
операторов
с
одинаковым
приоритетом.
8 + 2 + 2 = (8 + 2) + 2 = 8 + (2 + 2)
Результат одинаковый!
8/2/2
(8/2)/2 ≠
4/2=2.
8/(2/2).
Результат разный!
Все
арифметические
левоассоциативные.
операторы

10.

2. Операторы отношения и сравнения на
равенство
Бинарные операторы:
1) отношения: «>», «>=», «<», «<=»;
2) сравнения на равенство: «==» (равно), «!=»
(неравно).
Приоритет одинаковый внутри группы.
prio(отношения) > prio(сравнения на равенство)
prio(отношения) < prio(арифметических)
k+1<l+2
year%4 == 0
(k+1) < (l+2)
(year%4) == 0

11.

3. Логические операторы
Бинарные операторы:
- «&&» - логическое ‘и’;
- «||» - логическое ‘или’.
Операнды вычисляются слева направо.
Результат «&&» есть «ложь», как только первый
попавшийся операнд есть «ложь».
Результат «||» есть «истина», как только первый
попавшийся операнд – «истина».
!!! Дальше вычисление не производится.

12.

Свойства:
- «&&» и «||» - левоассоциативные;
- prio(&&) > prio(||);
prio(&&) < prio
равенство).
(отношения,
сравнения
на
Унарный оператор: логическое отрицание (не) –
«!».
prio(!) > prio(&&, ||).
Эквивалентны: res==0 и !res.

13.

X && Y
Y
X || Y
И
Л
Y
X
И
Л
X
И
И
Л
И
И
И
Л
Л
Л
Л
И
Л
!X
!X
X
И
Л
Л
И

14.

Пример. Расставить приоритеты операторов в
выражении (проверка года на високосность).
year % 4 == 0 && year % 100 != 0 ||
year % 400 == 0

15.

4. Побитовые операторы
Применяется к целочисленным операндам
(char, short, int, long) знаковым и беззнаковым.
4.1. Бинарные
Побитовое И – «&»: используют для обнуления
разрядов или бита внутри байта.
Пример 16.
int x=17; //10001
int y=2;
//00010
int z=1;
//00001
int w=x&y; //00000
int u=x&z; //00001
X & Y
Y
1
0
1
1
0
0
0
0
X

16.

Побитовое ИЛИ – «|»: для установки разрядов
в 1.
Пример 17.
int x=17;
/* 10001 */
int y=2;
/* 00010 */
int z=1;
/* 00001 */
int w=x|y; /* 10011 */
int u=x|z; /* 10001 */
X | Y
Y
1
0
1
1
1
0
1
0
X
!!! Следует отличать логические и побитовые
операторы.
int x=1, y=2;
int t=x&&y; /* !=0 */
int s=x&y; /* =0 */

17.

Побитовое исключающее ИЛИ – «^»: 1 –
разные значения битов; 0 – одинаковые.
X^Y:
X
1
0
Y 1
0
1
0
1
0
Пример 18.
int x=17;
int y=3;
int w=x^y;
/* 10001 */
/* 00011 */
/* 10010 */

18.

Сдвиг влево – «<<».
Правый операнд – это целое положительное
число, указывающее на сколько битов
необходимо сдвинуть левый операнд влево.
Правый операнд должен быть >0.
Пример 19.
int x=2;
/*0010*/
int y=x<<1; /*0100*/
Сдвиг влево соответствует умножению левого
операнда на степень двойки, показатель
степени задается правым операндом оператора
сдвига.

19.

Сдвиг вправо – «>>».
Правый операнд – это целое положительное
число, указывающее на сколько битов
необходимо сдвинуть левый операнд вправо.
Правый операнд должен быть >0.
Пример 20.
int x=6;
/*0110*/
int y=x>>1; /* 0011*/
int z=x>>2; /*0001*/
Сдвиг вправо соответствует делению нацело на
степень двойки.

20.

4.2. Унарные
Оператор побитового отрицания – «~».
x
0
1
~x
1
0
Пример 21.
int x=6;
/* 0110 */
int y=x&~3; /* 0110&~0011=0110&1100=0100 */

21.

5. Операторы присваивания
Простейший оператор присваивания:
<v>=<e>
<v> - переменная
<e> - выражение
Оператор
присваивания

бинарный,
инфиксный.
Семантика: значение выражения, в которое
входит присваивание, является значением
левого операнда после присваивания.
Пример 22.
b=a;
a=b=c=0; // многократное присваивание
// (a=(b=(c=0)))

22.

Остальные операторы присваивания имеют
следующий вид:
<e1><op>=<e2>
<op> - бинарный оператор: +, -, /, *, %, &, |, ^,
<<, >>.
Выполнение:
<e1>=<e1><op><e2>
<e1> модифицируется с помощью оператора и
<e2> и записывается в <e1>.
Значки операторов присваивания: +=, /=, *=, -=,
%=, <<=, >>=, |=, ^=, &=.
Пример 23.
int x=6, y=10;
y*=x; //y=60

23.

int z, x8, y8, z8;
x=15;
y=8;
z=5;
x+=2;
y-=7;
z*=4;
z/=2;
z%=3;
x8<<=2;
y8>>=1;
x8|=03;
x8^=07;
x8=015;
y8=07;
z8=05;
/*x=17*/
/*y=1*/
/*z=20*/
/*z=10*/
/*z=1*/
/*x8=064*/
/*y8=3*/
/*x8=067*/
/*x8=060*/

24.

!!!
Все
операторы
правоассоциативные.
x/=a+b x=x/(a+b)
prio(=) < prio(всех
операторов).
ранее
присваивания
рассмотренных
6. Инкрементные и декрементные операторы
Инкрементный – «++»: добавляет 1 к операнду.
Декрементный – «--»: вычитает 1 из операнда.
Префиксный
«++»
(«--»)
увеличивает
(уменьшает) операнд до его использования.
Постфиксный
«++»
(«--»)
увеличивает
(уменьшает) операнд после его использования.

25.

Пример 24.
int x=2, y, z;
y=x++; //1) y=x; 2) x=x+1; y=2, x=3
z=++x; //1) x=x+1; 2) z=x; x=3, z=3;
!!! Эти операторы можно применять только к
переменным, но не к выражениям и константам.
Пример 25.
y++; --x; //верно
(y+x)++; //неверно
1++;
//неверно

26.

7. Условный
выражение)
оператор
(?)
(условное
Синтаксис:
<e1>?<e2>:<e3>
Семантика:
1) Вычисляется значение первого выражения
<e1>
2) Если <e1>=«истина», то значение оператора
= <e2>
3) Иначе значение оператора = <e3>
English     Русский Правила