Обзор языка программирования C

Содержание

Слайд 2

Краткая история и особенности

Разработан Dennis Ritchie в Bell Labs, 1972
Первое применение –

Краткая история и особенности Разработан Dennis Ritchie в Bell Labs, 1972 Первое
портирование ОС Unix на PDP-11
Переносимость
Минимализм
Прямой доступ к памяти
Эффективность сгенерированного кода
Основная нынешняя область применения – системное программирование

Слайд 3

Hello, world!

#include /* Заголовочный файл */
main() /* main() -

Hello, world! #include /* Заголовочный файл */ main() /* main() - место
место начала исполнения программы */
{
printf("hello, world\n"); /* отформатировать и напечатать строку */
}

Слайд 4

Компиляция программы, состоящей из одного файла

gcc hello.c
GCC = GNU Compiler Collection
hello.c –

Компиляция программы, состоящей из одного файла gcc hello.c GCC = GNU Compiler
имя программы
Выходной файл – a.out в рабочей директории
Опция –o позволяет задать имя (gcc hello.c –o hello)
Больше информации – man gcc

Слайд 5

Переменные.

Имена состоят из букв, цифр и знака подчёркивания(_), первый символ не может

Переменные. Имена состоят из букв, цифр и знака подчёркивания(_), первый символ не
быть цифрой
Переменные регистрозависимые, т.е. A и a – разные переменные
Обычно нижний регистр используется для переменных, верхний – для констант (о них позже)
размер переменной можно определить с помощью sizeof(varible)

Слайд 6

Переменные – 2. Основные типы.

char – 1 байт. Часто используется при работе

Переменные – 2. Основные типы. char – 1 байт. Часто используется при
с текстовыми строками и памятью.
int – целое число. В данный момент обычно 32 или 64 бита. Конкретный размер зависит от реализации.
float – число с плавающей точкой с единичной точностью.
double – число с плавающей точкой с двойной точностью.
void

Слайд 7

Переменные – 3. Квалификаторы.

signed/unsigned – квалификатор char и int. Показывает, является ли

Переменные – 3. Квалификаторы. signed/unsigned – квалификатор char и int. Показывает, является
переменная знаковой (-N..N-1) или беззнаковой (0..2*N-1)
По умолчанию int является signed, для char наличие знака зависит от реализации
short/long/long long – модификатор размера переменной.
sizeof(short int) <= sizeof(int) <= sizeof(long int) <= sizeof(long long int)

Слайд 8

Переменные – 4. Примеры.

unsigned char c;
int i; /* синоним signed int i

Переменные – 4. Примеры. unsigned char c; int i; /* синоним signed
*/
double d;
short int s;
unsigned long l; /* при наличии long/short тип int может быть пропущен */
int one = 1;

Слайд 9

Функция printf ()

#include
int printf(const char *format, список аргументов для подстановки);
строка с

Функция printf () #include int printf(const char *format, список аргументов для подстановки);
форматом
%s – строка
% – целое число
%f – float
%g – double

Слайд 10

Примеры

#define STR "абырвалг"
printf ("i = %d\n", 10);
/* i = 10 */
printf ("My

Примеры #define STR "абырвалг" printf ("i = %d\n", 10); /* i =
name is %s\n", STR);
/* My name is абырвалг */
printf ("Длина строки \"%s\" равна %d.\n", STR, strlen(STR));
/* Длина строки "абырвалг" равна 8. */
printf ("2/3=%10.5f", (float)2/3); /* 10 задаёт минимальную длину поля, 5 - число цифр после запятой */
/* 2/3= 0.66667 */

Слайд 11

Введение в массивы

Набор однотипных элементов, последовательно располагающихся в памяти
Нумерация идёт с нуля
Возможно

Введение в массивы Набор однотипных элементов, последовательно располагающихся в памяти Нумерация идёт
задание многомерных массивов
Количество элементов массива – sizeof(arr)/sizeof(arr[0])

int i[100];
double map[100][100]; /* Двумерный */
int sequence[] = {10, 20, 30}; /* С инициализацией */
char string[] = "This is madness!\n”; /* Строка – тоже массив */

Слайд 12

Введение в указатели

Указатель – переменная, содержащая адрес другой переменной
& -

Введение в указатели Указатель – переменная, содержащая адрес другой переменной & -
взятие адреса переменной (взятие адреса объекта)
* - разыменование указателя (доступ к объекту, адрес которого содержит указатель)
Void * - «бестиповой» указатель
NULL – нулевой указатель

Слайд 13

Введение в указатели - 2

int *p = NULL;
int i = 10;
p =

Введение в указатели - 2 int *p = NULL; int i =
&i; /* теперь p содержит адрес в памяти, по которому находится переменная i */
*p = *p + 1; /* запись в адрес, находящийся в p его содержимого, увеличенного на 1 */
/* теперь i содержит 11 */
*p = 0;
/* теперь i содержит 0 */

Слайд 14

Строковые константы

Последовательность(возможно, нулевая) ненулевых символов, заканчивающаяся на 0
Задание строки возможно помещением текста

Строковые константы Последовательность(возможно, нулевая) ненулевых символов, заканчивающаяся на 0 Задание строки возможно
в двойные кавычки (одинарные кавычки – взятие кода символа)
Спецсимволы: \n, \r, \ooo, \xhh, \”, \’, \0, \\ и т.д.
Функция C standard library strlen(str) – длина строки без завершающего \0

char *s1 = "Я строка";
char *s2 = "Я" " тоже" " строка";
printf ("Первая строчка\nВторая \”строчка\”");

s1

Слайд 15

Использование #define для объявления констант.

#define MESSAGE "Some frequently used string."
#define DEBUG 0
#define

Использование #define для объявления констант. #define MESSAGE "Some frequently used string." #define
BUFSIZE 1024
#define NEWBUF BUFSIZE*2
/* теперь мы можем использовать определённые выше константы*/

Слайд 16

«Истина» и «ложь»

Если численное значение 0, оно ложно
Иначе оно истинно
Например, 1, 1000,

«Истина» и «ложь» Если численное значение 0, оно ложно Иначе оно истинно
-1234 – все истинны

Слайд 17

Операторы

Арифметические: +, -, *, /, %(остаток от деления)
Логические: >, >=, <, <=,

Операторы Арифметические: +, -, *, /, %(остаток от деления) Логические: >, >=,
==, !=, &&(логическое И), ||(логическое ИЛИ), !(отрицание, x!=0 => 0, x==0 => 1)
Побитовые: &(побитовое И), |(побитовое ИЛИ), ^(исключающее ИЛИ), <<(сдвиг влево), >>(сдвиг вправо), ~(дополнение)

Слайд 18

Примеры

int a, b;
double x;
a = 2*2; /* a = 4 */
b =

Примеры int a, b; double x; a = 2*2; /* a =
(a + 8) / 2; /* b = 6 */
b = 3 / 2; /* b = 1 */
x = 3 / 2; /* x = 1.5 */
a = 1234 || 0; /* a != 0 */
a = 1234 && 0; /* a == 0 */
a = (1 == 0) || (10 > 1) /* a != 0 */

Слайд 19

++ и --

Прибавление/вычитание единицы с последующей записью значения в переменную
Могут находиться перед

++ и -- Прибавление/вычитание единицы с последующей записью значения в переменную Могут
переменной(префиксная запись, «сперва прибавить/вычесть, потом использовать») и после (постфиксная запись, наоборот)

Слайд 20

Примеры

int x = 0, n = 0;
n++; /* n = 1 */
x

Примеры int x = 0, n = 0; n++; /* n =
= ++n; /* x = 2, n = 2 */
x = n++; /* x = 2, n = 3 */

Слайд 21

+=, -=, *= и т.д.

A += B эквивалентно A = A +

+=, -=, *= и т.д. A += B эквивалентно A = A
B
+ - * / % << >> & ^ |

/* Пример */
x = 2;
x *= 5; /* x = 10 */
x -=3; /* x = 7 */

Слайд 22

A ? B : C

Если A истинна(т.е. не равна 0), то B,

A ? B : C Если A истинна(т.е. не равна 0), то
иначе C

/* Пример: */
/* если x кратно 2, то y = 1, иначе 0 */
y = x % 2 ? 0 : 1;

Слайд 23

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

Возможное преобразование:
автоматическое
(type)variable
“Общее правило” – автоматическое преобразование происходит при преобразовании в более

Преобразование типа. Возможное преобразование: автоматическое (type)variable “Общее правило” – автоматическое преобразование происходит
«ёмкий» тип данных (например, char -> long int), при котором преобразование имеет смысл (целочисленный тип -> целочисленный тип; указатель -> указатель)

Слайд 24

Правила конверсии для беззнаковых чисел

If either operand is long double, convert the

Правила конверсии для беззнаковых чисел If either operand is long double, convert
other to long double.
Otherwise, if either operand is double, convert the other to double.
Otherwise, if either operand is float, convert the other to float.
Otherwise, convert char and short to int.
Then, if either operand is long, convert the other to long.

Слайд 25

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

Наивысший

Самый низкий

Приоритет операторов Наивысший Самый низкий

Слайд 26

if-else

Если expression истинно, то statement1, иначе – statement2

if (expression)
statement1
else
statement2

if-else Если expression истинно, то statement1, иначе – statement2 if (expression) statement1 else statement2

Слайд 27

Примеры

/* 1. else идёт с соседним if-ом! */
if (n >

Примеры /* 1. else идёт с соседним if-ом! */ if (n >
0)
if (a > b)
z = a;
else
z = b;
/* 2. */
if (n > 0) {
if (a > b)
z = a;
}
else
z = b;

Слайд 28

switch

Условное выполнение кода при равенстве выражения одной из численных констант

switch (expression)

switch Условное выполнение кода при равенстве выражения одной из численных констант switch
{
case const-expr: statements
case const-expr: statements
default: statements
}

Слайд 29

Пример

switch (c) {
case '0': case '1': case '2': case '3':

Пример switch (c) { case '0': case '1': case '2': case '3':
case '4':
case '5': case '6': case '7': case '8': case '9':
ndigit[c-'0']++;
break;
case ' ':
case '\n':
case '\t':
nwhite++;
break;
default:
nother++;
break;
}

Слайд 30

while - цикл

Выполнение statement пока expression не равен 0

while (expression)
statement

/*

while - цикл Выполнение statement пока expression не равен 0 while (expression)
Пример */
int i = 0;
while (i < 10){
printf("%d\n”, i);
i ++;
}

Слайд 31

for - цикл

содержит 3 выражения, разделённые запятой
Аналогичен следующей конструкции с while:

for

for - цикл содержит 3 выражения, разделённые запятой Аналогичен следующей конструкции с
(expr1; expr2; expr3)
body

expr1;
while (expr2) {
statement
expr3;
}

/* Пример */
printf ("напечатать все степени двойки, меньшие 1000\n");
for (i = 1; i <1000; i *=2)
printf("%d\n", i);

Слайд 32

Цикл do-while

Выполнять statement пока expression не равно нулю. statement выполнятся хотя бы

Цикл do-while Выполнять statement пока expression не равно нулю. statement выполнятся хотя
раз

do
statement
while (expression);

Слайд 33

Break и continue

Break: ранний выход из циклов for, while, do
Выход осуществляется из

Break и continue Break: ранний выход из циклов for, while, do Выход
самого вложенного цикла
Continue: начало следующей итерации цикла

Слайд 34

Примеры

/* trim: remove trailing blanks, tabs, newlines */
int trim(char s[])

Примеры /* trim: remove trailing blanks, tabs, newlines */ int trim(char s[])
{
int n;
for (n = strlen(s)-1; n >= 0; n--)
if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
break;
s[n+1] = '\0';
return n;
}

for (i = 0; i < n; i++)
if (a[i] < 0) /* skip negative elements */
continue;
... /* do positive elements */

Слайд 35

Goto

Goto – переход по метке
Использование оправданно очень редко!
Есть возможность перехода между функциями

Goto Goto – переход по метке Использование оправданно очень редко! Есть возможность
– man longjmp

for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (a[i] == b[j])
goto found;
/* didn't find any common element */
...
found:
/* got one: a[i] == b[j] */
...

Слайд 36

Функции

Перед использованием функция должна быть объявлена.
Тип возвращаемого значения может быть void(ничего не

Функции Перед использованием функция должна быть объявлена. Тип возвращаемого значения может быть
возвращает)
Количество аргументов может быть как целым, так и переменным(man stdarg). Кроме того, оно тоже может быть равным нулю (void).
Пустые скобки – количество аргументов не определено!
Функции не могут быть объявлены внутри других функций

тип_возвращаемого_значения имя_функции (аргумент1, аргумент2, ...)
{
... /* тело функции */
}

Слайд 37

Пример

#include
int power(int m, int n);
/* test power function

Пример #include int power(int m, int n); /* test power function */
*/
main()
{
int i;
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2,i), power(-3,i));
return 0;
}
/* power: raise base to n-th power; n >= 0 */
int power(int base, int n)
{
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}

Слайд 38

Заголовочные файлы

Заголовочные файлы

Слайд 39

external, static, register, volatile переменные

External – задание внешнего связывания (external linking). Все

external, static, register, volatile переменные External – задание внешнего связывания (external linking).
обращения к external объектам, даже из разных, независимо откомпилированных файлов, происходят к одному и тому же объекту в памяти
Static - вне функций - ограничение области видимости до файла, внутри – сохранение значения между вызовами для локальных переменных
Register - рекомендация компилятору держать значение в переменной в регистре процессора
Volatile - Значение переменной может быть изменено вне программы

Слайд 40

Директивы препроцессора

#include “name”, #include
#define что_заменить на_что_заменить
#undef
#if, #ifdef, #ifndef, #elif, #endif

Директивы препроцессора #include “name”, #include #define что_заменить на_что_заменить #undef #if, #ifdef, #ifndef, #elif, #endif

Слайд 41

Примеры

#define BUFSIZE 1024
#define forever for (;;)
#define max(A, B) ((A) > (B)

Примеры #define BUFSIZE 1024 #define forever for (;;) #define max(A, B) ((A)
? (A) : (B)) /* обратите внимание на сторонние эффекты! */

#if SYSTEM == SYSV
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"
#endif
#include HDR

Слайд 42

Ещё об указателях и массивах

swap(a, b);
…………………………………………………………………………………
void swap(int x, int y)

Ещё об указателях и массивах swap(a, b); ………………………………………………………………………………… void swap(int x, int
/* НЕПРАВИЛЬНО*/
{
int temp;
temp = x;
x = y;
y = temp;
}

Слайд 43

Ещё об указателях и массивах

swap(&a, &b);
void swap(int *px, int *py)

Ещё об указателях и массивах swap(&a, &b); void swap(int *px, int *py)
/* поменять местами *px и *py */
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}

Слайд 44

Ещё об указателях и массивах

int a[10];
int *pa;
pa = &a[0];
x = *pa;
y =

Ещё об указателях и массивах int a[10]; int *pa; pa = &a[0];
*(pa + 1) /* над указателями возможны арифметические действия */

Слайд 45

Передача параметров программе. Аргументы main.

1 аргумент – количество аргументов
2 аргумент – массив

Передача параметров программе. Аргументы main. 1 аргумент – количество аргументов 2 аргумент
строк с аргументами

#include
/* echo command-line arguments; 2nd version */
main(int argc, char *argv[])
{
while (--argc > 0)
printf("%s%s", *++argv, (argc > 1) ? " " : "");
printf("\n");
return 0;
}

Слайд 46

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

Возможно задание и передача указателей на функции

int (*pf)(); /* указатель

Указатели на функцию Возможно задание и передача указателей на функции int (*pf)();
на функцию, возвращающую int */
int (*comp)(int, void *); /* указатель на функцию с целым числом в роли первого аргумента и void * указателем в роли второго */

Слайд 47

Набор переменных (возможно, различных типов) объединённых вместе для простоты работы с ними

Набор переменных (возможно, различных типов) объединённых вместе для простоты работы с ними
struct struct_name { ... } x, y, z;
p->x то же самое, что (*p).x

struct point {
int x;
int y;
};

Структуры

Слайд 48

typedef

Задание пользовательского типа данных

typedef struct tnode { /* the tree node:

typedef Задание пользовательского типа данных typedef struct tnode { /* the tree
*/
char *word; /* points to the text */
int count; /* number of occurrences */
struct tnode *left; /* left child */
struct tnode *right; /* right child */
} Treenode;

Слайд 49

Полезные функции С standard library

printf/scanf, sprintf/sscanf, fprintf/fscanf
putchar/getchar, putc/getc
fopen/fclose – работа с файлами
memcpy
strcpy
malloc/realloc/free
strlen
is(alpha/upper/digit/…)
sin,cos,sqrt,…

Полезные функции С standard library printf/scanf, sprintf/sscanf, fprintf/fscanf putchar/getchar, putc/getc fopen/fclose –
(-lm в строке компиляции для линковки мат. библиотеки)

Слайд 50

Литература

Б. Керниган, Д. Ритчи – «Язык программирования Си» (Kernigan, Ritchie – “The

Литература Б. Керниган, Д. Ритчи – «Язык программирования Си» (Kernigan, Ritchie –
C Programming Book”) aka “K&R”
The C standard library: Linux manpages / MSDN
Б. Керниган, Р. Пайк – «Практика программирования» (Kernigan, Pike – “The Practice of Programming”)

Слайд 51

Спасибо за внимание!

Вопросы?
Следующая лекция – Введение в C++

Спасибо за внимание! Вопросы? Следующая лекция – Введение в C++

Слайд 53

Перечисления (enumerations)

/* Предоставляют простой способ задания нескольких констант с различиющимися значениями */
/*

Перечисления (enumerations) /* Предоставляют простой способ задания нескольких констант с различиющимися значениями
По умолчанию значение первого элемента - 0 */
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
/* Переменной может и не быть: */
enum { UP, DOWN, RIGHT, LEFT };

Слайд 54

unions

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

union

unions Структура, члены которой располагаются по одному и тому же адресу памяти
u_tag {
int ival;
float fval;
char *sval;
} u;
Имя файла: Обзор-языка-программирования-C.pptx
Количество просмотров: 128
Количество скачиваний: 0