Синтаксис и алфавит языка Си. (Лекция 2)

Содержание

Слайд 2

2. СИНТАКСИС И АЛФАВИТ ЯЗЫКА СИ Для образования лексических частей языка

2. СИНТАКСИС И АЛФАВИТ ЯЗЫКА СИ

Для образования лексических частей языка (лексем)

и связей между ними используются:
все символы латинского алфавита
цифры
специальные знаки ! @ % $ & * ( ) - + \ / | {} [ ] . ,_ ~ “ ‘ # :

2.1. Алфавит языка

Слайд 3

2.2. Синтаксис языка 2.2.1. Лексемы языка Ключевые слова Идентификаторы Константы Литеральные

2.2. Синтаксис языка

2.2.1. Лексемы языка

Ключевые слова

Идентификаторы

Константы

Литеральные строки

Операторы

Разделители

Лексема – единица языка
Лексемы

выделяются на фазе лексического анализа компиляции - исходный код программы разбивается на лексемы и разделители.
Разделители указывают, где начинаются и кончаются лексемы, любое другое присутствие разделителей игнорируется

int z,k; float b;

int z,k;
float b;

int
z
,
k
;
float
b
;

Слайд 4

Ключевые слова - это слова, зарезервированные для специального предназначения и их

Ключевые слова - это слова, зарезервированные для специального предназначения и их

нельзя использовать как имена идентификаторов.

2.2.2. Ключевые слова

Таблица 1

Слайд 5

Слайд 6

2.2.3. Идентификаторы Идентификаторы - это произвольные имена любой длины для классов,

2.2.3. Идентификаторы

Идентификаторы - это произвольные имена любой длины для классов, объектов,

функций, переменных, типов данных, определенных пользователем и т.д.

A…Z и a…z

0…9

Знак _

Слайд 7

Ограничения Первый символ должен быть буквой или _. Распознаются только первые

Ограничения

Первый символ должен
быть буквой или _.

Распознаются только
первые 32 символа

Си

– регистро-зависимый язык

Sum, sum и suM - разные идентификаторы

Слайд 8

2.2.4. Константы Классы констант с плавающей точкой символьные целые перечислимые

2.2.4. Константы

Классы констант

с плавающей точкой

символьные

целые

перечислимые

Слайд 9

Целые константы Десятичные Восьмеричные Шестнадцатеричные от 0 до 4294967295 записывается лидирующий

Целые константы
Десятичные
Восьмеричные
Шестнадцатеричные

от 0 до 4294967295

записывается лидирующий 0
при содержании

в записи числа 9 и 8 генерируется ошибка
Максимальное значение - 037777777777

начинаются с 0х (0Х)
максимальное значение 0хFFFFFFFF

Слайд 10

Любая целая константа может заканчиваться суффиксами L и (или) U Длинное

Любая целая константа может заканчиваться суффиксами L и (или) U

Длинное (long)

Беззнаковое


(unsigned)

Константы в инициализации переменных:
int z = 10 /* десятичное 10*/
int x = 010 /* десятичное 8 */
int p = 0XF /* десятичное 15 */
Константы в выражениях:
long m = 2*100L /* умножение на десятичную константу типа long int */
unsigned n = 2*100U /* умножение на десятичную константу типа unsigned int */

Слайд 11

Символьные константы Символьная константа - это один или более символов, заключенные

Символьные константы
Символьная константа - это один или более символов, заключенные в

апострофы.

'A'
'='
'\n'

Тип
char

Тип
int

используется для обозначения ESC последовательности:
отображение некоторых графическиx символов.
представление ASCII символов или управляющего кода

Слайд 12

Таблица 2. ESC последовательности в Си

Таблица 2. ESC последовательности в Си

Слайд 13

Таблица 2. Продолжение

Таблица 2. Продолжение

Слайд 14

Константы с плавающей точкой Десятичная целая Десятичная точка Десятичная дробная e

Константы с плавающей точкой

Десятичная
целая

Десятичная
точка

Десятичная
дробная

e или E
(необязательная)

знаковая
целая экспонента


(необязательная)

суффикс типа f, F, l, L
(необязательный).

Примеры вещественных констант:
3.25e4 - 3.25⋅104
.05 - 0.05
1. - 1.0
-1.25 - -1.25
3e-8 - 3.0⋅10-8
2.5E+6- 2.5⋅106

Слайд 15

2.2.5. Литеральные строки Литеральная строка - это массив символов, записанный как

2.2.5. Литеральные строки

Литеральная строка - это массив символов, записанный как последовательность

любого числа символов внутри кавычек: "это пример литеральной строки".

строка "\n\"Hello !\"\n"

Вывод на экран:
"Hello !“

Слайд 16

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

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

ESC последовательности
хранится в памяти как заданная последовательность символов и завершается нулевым символом ('\0')
нулевая (пустая )строка хранится как символ '\0'.
пустая строка обозначается ""
Слайд 17

2.2.6. Операторы Оператор - это лексема, которая выполняет некоторые вычисления, когда

2.2.6. Операторы

Оператор - это лексема, которая выполняет некоторые вычисления, когда применяется

к переменной или к другому объекту в выражении.

Унарные

Бинарные

Один тернарный

Слайд 18

Таблица 3. Унарные операторы

Таблица 3. Унарные операторы

Слайд 19

Таблица 3. Продолжение

Таблица 3. Продолжение

Слайд 20

Таблица 4. Бинарные операторы

Таблица 4. Бинарные операторы

Слайд 21

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 22

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 23

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 24

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 25

Таблица 4. Продолжение Выражение, использующее операторы отношения, в результате работы принимает

Таблица 4. Продолжение

Выражение, использующее операторы отношения, в результате работы принимает значение

true, если отношение истинно, если же отношение ложное, выражение принимает значение false.
Слайд 26

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 27

Таблица 4. Продолжение

Таблица 4. Продолжение

Слайд 28

Тернарный оператор A ? X : Y Если истинно отношение А,

Тернарный оператор A ? X : Y
Если истинно отношение А,

то выполняются действия Х; иначе выполняются действия Y.

z = (x

Слайд 29

2.2.7. Знаки пунктуации [ ] ( ) { } , ;

2.2.7. Знаки пунктуации

[ ] ( ) { } , ; :

... * = #.
[ ] - указывают список индексов одномерного или многомерного массива:
char word[] = "Пример строки"; /* строка символов.*/
float mat[3][4]; /* матрица вещественных символов, имеющая три строки и четыре столбца. */
int x[3]; /* целочисленный массив из трех элементов. */
Слайд 30

() - выделяют групповое выражение, условное выражение, используются для изменения обычного

() - выделяют групповое выражение, условное выражение, используются для изменения обычного

порядка выполнения операторов и указывают на вызов функции и параметры функции
d = (a+b)*х; /* указывают на порядок действий */
if (х==z) x+=z; /* используются в условных выражениях */
matrix(); /* вызов функции matrix без аргументов */
int change(int x,int y); /* объявление функции с аргументами */
Слайд 31

{ } - указывают на начало и конец составного оператора: for(int

{ } - указывают на начало и конец составного оператора:
for(int i

=0; i<10;i++)
{ x ++; y--; }
, - разделяет элементы списка аргументов функции, используется для перечисления действий, вместо составного оператора.
void func(int n, float f, char ch);
for(int i =0; i<10;i++)
x ++, y--;
Слайд 32

; - указывает на конец оператора Любое правильное выражение (включая пустое

; - указывает на конец оператора
Любое правильное выражение (включая пустое

выражение) должно заканчиваться ";".
":“ - указывает помеченный оператор.
switch (a) { /* пример использования множественного выбора */
case 1: puts("One");
break;
case 2: puts("Two");
break;
...
default: puts("None of the above!");
break;
}
Слайд 33

* - указывает на создание указателя на тип char * str;

* - указывает на создание указателя на тип
char * str; /*

указатель на символ */
int ** x ; /* указатель на указатель на int */
# - указывает на директиву препроцессора, используется для замещения и объединения лексем во время фазы препроцессора.
Слайд 34

3. Основные типы данных 3.1. Простые типы

3. Основные типы данных

3.1. Простые типы

Слайд 35

3.2. Приставки к типам данных

3.2. Приставки к типам данных

Слайд 36

3.3. Преобразование типов Язык Си поддерживает неявное преобразование типов. int x

3.3. Преобразование типов
Язык Си поддерживает неявное преобразование типов.

int x =

5,y = 2,z;
z=x/y;
x = 2.25;

// z= 2
// x = 2

Слайд 37

Приоритет типов double float long int char short bool

Приоритет типов

double

float

long

int

char

short

bool

Слайд 38

Основные правила неявного преобразования типов Если два операнда выполняемой операции имеют

Основные правила неявного преобразования типов

Если два операнда выполняемой операции имеют тип

А, а результат имеет тип В, то результат в процессе выполнения операции будет приведен к типу А.

float z;
z = 1/25; // переменная z будет равна 0

Слайд 39

Если два операнда одной операции имеют тип А и В, а

Если два операнда одной операции имеют тип А и В, а

результат имеет тип В, то результат будет приведен к типу В.

int z;
z = 42/2.5; // переменная z примет значение 16;

float z;
z = 42/2.5; // переменная z примет 16.7666;

Слайд 40

Если операция выполняется с двумя операндами разных типов, то обе величины

Если операция выполняется с двумя операндами разных типов, то обе величины

приводятся к высшему (по рангу) из типов.

int z = 5;
float y= 2.11
z = z/y; // переменная z примет значение 2

Слайд 41

Явное преобразование типов : (char)(120 + 0.5) /*значение выражения будет приведено к символу ‘x’. */

Явное преобразование типов

:
(char)(120 + 0.5) /*значение выражения будет приведено к

символу ‘x’. */
Слайд 42

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

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

использования в операциях
не происходит автоматическая инициализация описанных переменных
нельзя дважды использовать при описании один идентификатор

Объявление и инициализация переменных

int x; // объявление переменной
int k=0; // объявление и //инициализация переменной
char m = ‘c’; // объявление и //инициализация переменной
x = 13; // инициализация переменной

Слайд 43

3.4.Производные типы данных Указатель на переменную заданного типа содержит адрес переменной

3.4.Производные типы данных

Указатель на переменную заданного типа содержит адрес переменной указанного

типа.
Синтаксис: <тип> * <имя переменной>

3.4.1. Указатели

int *x;
double *y;
float *z;

Адрес, по которому будет храниться переменная типа int

Адрес, по которому будет храниться переменная типа double

Адрес, по которому будет храниться переменная типа float

Слайд 44

Занимает в памяти 2 байта Рекомендуется обнулять описанный в программе указатель

Занимает в памяти 2 байта
Рекомендуется обнулять описанный в программе указатель
Перед использованием

указателя необходимо выделить память

Указатели

Указатели на тип

Указатели на функции

Слайд 45

// пустой (нулевой) указатель int *x = NULL; // выделение памяти x = (int)malloc(sizeof(int));

// пустой (нулевой) указатель
int *x = NULL;

// выделение памяти
x = (int)malloc(sizeof(int));

Слайд 46

3.4.2. Ссылки Ссылка – это адрес существующей переменной. Ссылка формируется добавлением

3.4.2. Ссылки

Ссылка – это адрес существующей переменной. Ссылка формируется добавлением знака

«&» к имени переменной слева.

int z = 12; //объявлена и задана целая переменная
int *k = &z; // указателю k присваивается значение //адреса переменной z.

1

2

a

b

f

e

z

k

a

Область данных

Слайд 47

3.4.3. Разыменование указателей Для получения или инициализации значения, хранящегося по заданному

3.4.3. Разыменование указателей

Для получения или инициализации значения, хранящегося по заданному адресу,

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

int z = 12;
int *k = (int)malloc(sizeof(int));
*k = z;

1

2

a

b

f

e

z

k

Область данных

Оперативная память (Куча)

aa

bb

aa

12

Слайд 48

4. Конструкции структурного программирования в Си 4.1. Ветвление Оператор проверки условия

4. Конструкции структурного программирования в Си

4.1. Ветвление
Оператор проверки условия if [else]
Синтаксис:
if

(логическое выражение)
{действия при истинном значении выражения}
[else {действия при ложном значении выражения}]
Слайд 49

Пример … … int m = 12, n = 18; if

Пример



int m = 12, n = 18;
if

(m printf (“Сумма чисел %d”, m+n);
else printf (“Произведение чисел %d”, m*n);