Лекция
Привет, сегодня поговорим про основные понятия языка си, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое основные понятия языка си, данные языка си , настоятельно рекомендую прочитать все из категории Алгоритмизация и программирование. Структурное программирование. Язык C.
Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка Си следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя Си является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык Си регламентируется стандартом Американского института национальных стандартов ANSI С. В настоящее время, кроме стандарта ANSI C разработан международный стандарт ISO C (International Standard Organization C).
В пособии в разделах 1-6 рассматриваются основные конструкции языка Си (общие для Си и Си++). Примеры программ приведены в разделе 7.
Лексемы языка си
Ключевые слова - это слова, зарезервированные для специального предназначения и их нельзя использовать как имена идентификаторов.
Программа, написанная на языке Си, состоит из операторов. Каждый оператор вызывает выполнение некоторых действий на соответствующем шаге выполнения программы.
При написании операторов применяются латинские прописные и строчные буквы, цифры и специальные знаки. К таким знакам, например, относятся: точка (.), запятая (,), двоеточие (:), точка с запятой (;) и др. Совокупность символов, используемых в языке, называется алфавитом языка.
Оператор задает законченное описание некоторого действия.
Объединенная единым алгоритмом совокупность описаний и операторов образует программу.
Различают простые и составные операторы.
Унарные, бинарные, тернарные
Исполняемые неисполняемые
Составной оператор или блок - это группа операторов, заключенная в фигурные скобки. Блоки могут быть вложенными.
Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями.
Например,
int a ;
- это оператор описания целочисленной переменной a.
Исполняемые операторы задают действия над данными.
Например, присваивание, цикл, ввод и т.д.
В персональном компьютере символы хранятся в виде кодов. Соответствие между каждым символом и его кодом задается специальной кодовой таблицей. На нее разработан стандарт ASCII, поэтому коды символов называют ASCII-кодами.
Различают видимые и управляющие символы. Первые могут быть отображены на экране дисплея либо отпечатаны на принтере. Вторые вызывают определенные действия в машине, например: звуковой сигнал - код 710, возврат курсора на один шаг - код 810, горизонтальная табуляция - код 910, перевод курсора на новую строку - код 1010, перемещение курсора в начало строки - код 1310 и т.д. Такие управляющие символы имеют десятичные номера 0 - 31, 127.
Для представления каждого символа в персональном компьютере используется один байт, поэтому общее число символов равно 28= 256. Кодовая таблица, которая устанавливает соответствие между символом и его кодом, имеет 256 строк вида:
код_символа_в_заданной_системе_счисления - символ.
Первая половина кодовой таблицы является стандартной, а вторая используется для представления символов национальных алфавитов, псевдографических элементов и т.д.
Важным понятием языка является идентификатор, который используется в качестве имени объекта (функции, переменной, константы и др.). Идентификаторы должны выбираться с учетом следующих правил:
В программах на языке Си важная роль отводится комментариям. Они повышают наглядность и удобство чтения программ. Комментарии обрамляются символами /* и */. Их можно записывать в любом месте программы.
В языке Си++ введена еще одна форма записи комментариев. Все, что находится после знака // до конца текущей строки, будет также рассматриваться как комментарий. Отметим, что компилятор языка Си, встроенный в систему программирования Borland C++, позволяет использовать данный комментарий и в программах на Си.
Пробелы, символы табуляции и перехода на новую строку в программах на Си игнорируются. Это позволяет записывать различные выражения в хорошо читаемом виде. Кроме того, строки программы можно начинать с любой позиции, что дает возможность выделять в тексте группы операторов.
Унарные операторы языка Си
Код опера тора |
Название |
Результат операции |
& |
адресный оператор |
&x - адрес переменной х |
* |
оператор косвенной адресации |
*x – значение, расположенное по адресу х |
+ |
унарный плюс |
+5 – положительная константа |
- |
унарный минус |
- 4 – отрицательная константа, -х – значение переменной х с обратным знаком
|
Код оператора |
Название |
Результат операции |
~ |
побитовое отрицание |
~x – побитовое отрицание переменной x |
! |
логическое отрицание |
!x принимает значение false (лжи), если x имеет ненулевое (истинное) значение и наоборот |
++ |
префиксное/ постфиксное увеличение |
int x = 5; ++х; увеличит x на единицу; int x = 5; х++; увеличит x на единицу |
Бинарные операторы языка си
Код оператора |
Название |
Результат операции |
+ |
бинарный плюс |
вычисление суммы int x = 2,y = 1,z; z = x+y; |
- |
бинарный минус |
вычисление разности int x = 2,y = 1,z; z = x-y; |
* |
умножение |
вычисление произведения int x = 2,y = 1,z; z = x*y; |
Код оператора |
Название |
Результат операции
|
/ |
Деление |
вычисление частного, int x = 12,y = 2,z; z = x/y; |
% |
остаток от деления |
вычисление остатка от деления int x = 12,y = 7,z; z = x%y; |
<< |
сдвиг влево |
вычисление побитового сдвига влево int x = 12,y = 2,z; z = x << y; |
Код оператора |
Название |
Результат операции |
>> |
сдвиг вправо |
вычисление побитового сдвига вправо int x = 12,y = 2, z; z = x >> y; |
& |
побитовое AND (И) |
вычисление конъюнкции int x = 12,y = 2, z = x & y; |
^ |
побитовое XOR (исключающее или) |
вычисление сложения по модулю 2 int x = 12,y = 2, z = x ^ y; |
Код оператора |
Название |
Результат операции |
| |
побитовое OR (ИЛИ) |
вычисление дизъюнкции int x = 12,y = 2, z = x \ y; |
&& |
логическое AND (И) |
проверка условий, связанных логическим И |
|| |
логическое OR (ИЛИ) |
проверка условий, связанных логическим ИЛИ |
Код оператора |
Название |
Результат операции |
= |
присваивание |
присвоить переменной заданное значение или значение другой переменной |
*= |
присвоить произведение |
выражение х*=5 эквивалентно выражению x = x*5 |
+=, %=, <<=, >>=, &=, ^=, |=, -=, /= |
Операторы отношения
Выражение, использующее операторы отношения, в результате работы принимает значение true, если отношение истинно, если же отношение ложное, выражение принимает значение false.
Код оператора |
Название |
Результат операции
|
< |
меньше чем |
x |
<= |
меньше или равно чем |
x<=y, х меньше или равно y |
> |
больше чем |
x>y, х больше y |
>= |
больше или равно чем |
x>=y, х больше или равно y |
Код оператора |
Название |
Результат операции |
== |
равно |
x==y, х равно y |
!= |
не равно |
x!=y, х не равно y |
, |
оператор перечисления |
выполнить разделенные оператором перечисления слева направо, например: y+=5,x-=4,y+=x; |
Тернарный оператор
Тернарный оператор A ? X : Y
Если истинно отношение А, то выполняются действия Х; иначе выполняются действия Y
x=5; y=2 x=10; y=15
z = (x
Лексемы |
Операция |
Приоритет |
++ -- |
положительное и отрицательное приращение |
15 |
~ , ! , - +
|
побитовое НЕ , логическое НЕ, изменение знака, плюс |
15 |
& * |
Адрес (разыменование) |
15 |
(имя типа) |
приведение типа |
14 |
* / % |
мультипликативные операции |
13 |
+ - |
аддитивные операции |
12 |
<< >> |
сдвиг влево и вправо |
11 |
< > <= >= |
отношения |
10 |
== != |
равенство/неравенство |
9 |
& |
побитовое И |
8 |
^ |
побитовое исключающее ИЛИ |
7 |
| |
побитовое ИЛИ |
6 |
&& |
логическое И |
5 |
|| |
логическое ИЛИ |
4 |
? : |
условие |
3 |
= += -= *= /= %= <<= >>= &= ^= |= |
присваивание |
2 |
, |
последовательная оценка |
1 |
Программы оперируют с различными данными, которые могут быть простыми и структурированными. Об этом говорит сайт https://intellect.icu . Простые данные - это целые и вещественные числа, символы и указатели (адреса объектов в памяти). Целые числа не имеют, а вещественные имеют дробную часть. Структурированные данные - это массивы и структуры; они будут рассмотрены ниже.
В языке различают понятия "тип данных" и "модификатор типа". Тип данных - это, например, целый, а модификатор - со знаком или без знака. Целое со знаком будет иметь как положительные, так и отрицательные значения, а целое без знака - только положительные значения. В языке Си можно выделить пять базовых типов, которые задаются следующими ключевыми словами:
Базовые типы С89
Дадим им краткую характеристику:
Объект некоторого базового типа может быть модифицирован. С этой целью используются специальные ключевые слова, называемые модификаторами. В стандарте ANSI языка Си имеются следующие модификаторы типа:
Модификаторы записываются перед спецификаторами типа, например: unsigned char. Если после модификатора опущен спецификатор, то компилятор предполагает, что этим спецификатором является int. Таким образом, следующие строки:
long а; long int а;
являются идентичными и определяют объект а как длинный целый. Табл. 1 иллюстрирует возможные сочетания модификаторов (unsigned, signed, short, long) со спецификаторами (char, int, float и double), а также показывает размер и диапазон значений объекта (для 16-разрядных компиляторов).
Таблица 1
Тип | Размер в байтах (битах) | Интервал изменения |
char | 1 (8) | от -128 до 127 |
unsigned char | 1 (8) | от 0 до 255 |
signed char | 1 (8) | от -128 до 127 |
int | 2 (16) | от -32768 до 32767 |
unsigned int | 2 (16) | от 0 до 65535 |
signed int | 2 (16) | от -32768 до 32767 |
short int | 2 (16) | от -32768 до 32767 |
unsigned short int | 2 (16) | от 0 до 65535 |
signed short int | 2 (16) | от -32768 до 32767 |
long int | 4 (32) | от -2147483648 до 2147483647 |
unsigned long int | 4 (32) | от 0 до 4294967295 |
signed long int | 4 (32) | от -2147483648 до 2147483647 |
float | 4 (32) | от 3.4Е-38 до 3.4Е+38 |
double | 8 (64) | от 1.7Е-308 до 1.7Е+308 |
long double | 10 (80) | от 3.4Е-4932 до 3.4Е+4932 |
Преобразование типов
Неявное приведение типов
Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один наиболее расширенный тип.
|
Явное приведение типов.
Общая форма оператора явного приведения типа: (тип) выражение.
|
Правила приведения типов
Если два операнда выполняемой операции имеют тип А, а результат имеет тип В, то результат в процессе выполнения операции будет приведен к типу А.
float z;
z = 1/25; // переменная z будет равна 0
Если два операнда одной операции имеют тип А и В, а результат имеет тип В, то результат будет приведен к типу В.
int z;
z = 42/2.5; // переменная z примет значение 16;
float z;
z = 42/2.5; // переменная z примет 16.7666;
Идентификаторы - это произвольные имена любой длины для классов, объектов, функций, переменных, типов данных, определенных пользователем и т.д.
Переменная – именованная ячейка памяти, значение которой может меняться во время выполнения программы.
Переменная имеет:
Все переменные до их использования должны быть определены (объявлены). При этом задается тип, а затем идет список из одной или более переменных этого типа, разделенных запятыми. Например:
int a, b, c; char x, y;
В языке различают понятия объявления переменной и ее определения. Объявление устанавливает свойства объекта: его тип (например, целый), размер (например, 4 байта) и т.д. Определение наряду с этим вызывает выделение памяти (в приведенном примере дано определение переменных).
Переменные можно разделять по строкам произвольным образом, например:
float a; float b;
Переменные в языке Си могут быть инициализированы при их определении:
int a = 25, h = 6; char g = 'Q', k = 'm'; float r = 1.89; long double n = r*123;
Выясним теперь, где в тексте программы определяются данные. В языке возможны глобальные и локальные объекты. Первые определяются вне функций и, следовательно, доступны для любой из них. Локальные объекты по отношению к функциям являются внутренними. Они начинают существовать, при входе в функцию и уничтожаются после выхода из нее. Ниже показана структура программы на Си и возможные места в программе, где определяются глобальные и локальные объекты.
int a; /* Определение глобальной переменной */ int function (int b, char c); /* Объявление функции (т.е. описание ее заголовка)*/ void main (void) { //Тело программы int d, e; //Определение локальных переменных float f; //Определение локальной переменной ... } int function (int b, char c) /* Определение функции и формальных параметров (по существу - локальных переменных) b и c */ { //Тело функции char g; //Определение локальной переменной ... }
Отметим, что выполнение программы всегда начинается с вызова функции main( ), которая содержит тело программы. Тело программы, как и тело любой другой функции, помещается между открывающей и закрывающей фигурными скобками.
В языке Си все определения должны следовать перед операторами, составляющими тело функции. В языке Си++ это ограничение снято и определения могут находиться в любом месте программы. Если они сделаны в функции, то соответствующие объекты будут локальными, а если вне функций, то глобальными.
Каждый идентификатор имеет область действия и область видимости, которые, как правило, совпадают
Область видимости начинается в точке описания.
const int i = 2;
Имя, описанное внутри блока, локально по отношению к этому блоку. Имя, описанное вне любого блока, имеет глобальную область видимости.
Область действия и класс памяти зависят не только от собственно описания, но и от места его размещения в тексте программы.
|
Глобальная |
Локальная |
Статическая |
Размещение |
сегмент данных |
сегмент стека |
сегмент данных |
Время жизни |
вся программа |
блок |
вся программа |
Область видимости |
файл |
блок |
блок |
Обнуление |
да |
нет |
да |
int a; // 1 глобальная переменная a
int main() // 2
{ int b; // 3 локальная переменная b
static int c; // 4 локальная статическая переменная c
a = 1; // 5 присваивание глобальной переменной
int a; // 6 локальная переменная a
a = 2; // 7 присваивание локальной переменной
::a = 3; // 8 присваивание глобальной переменной
return 0; // 9
} // 10
Константа - это ограниченная последовательность символов алфавита языка, представляющая собой изображение фиксированного (неизменяемого) объекта.
Константы бывают: логические, числовые, символьные и строковые. Числовые константы делятся на целочисленные и вещественные.
Наряду с переменными в языке существуют следующие виды констант:
Операции ввода/вывода в языке Си организованы посредством библиотечных функций (причем их довольно много).
Самый простой механизм ввода - чтение по одному символу из стандартного входного потока (с клавиатуры) с помощью функции getchar( ). Она имеет следующий прототип (т.е. описание заголовка):
int getchar(void);
Здесь определен тип единственного аргумента (void) и тип возвращаемого функцией значения (int).
Оператор вида:
х = getchar( );
присваивает переменной х очередной вводимый символ. Переменная х должна иметь символьный или целый тип.
Другая функция - putchar(х) выдает значение переменной x в стандартный выходной поток (на экран дисплея). Функция putchar( ) имеет прототип:
int putchar(int);
Объявления getchar( ) и putchar( ) сделаны в заголовочном файле stdio.h, содержащем описания заголовков библиотечных функций стандартного ввода/вывода. Чтобы библиотечные функции стали доступны программе, к ней необходимо подключить данный файл. Подключение осуществляется с помощью директивы препроцессора
#include
помещаемой в начало программы (подробнее см. в разделе 5).
Заметим, что для функции getchar( ) после выбора символа необходимо нажать клавишу . Иногда это создает определенные неудобства. Функции getch( ) и getche( ) устраняют их. Они имеют следующие прототипы:
int getch(void); int getche(void);
Обе эти функции вводят символ сразу же после нажатия соответствующей клавиши (здесь не надо дополнительно нажимать клавишу ). Отличие между ними заключается в том, что getche( ) отображает вводимый символ на экране дисплея, а getch( ) - нет. Прототипы этих функций содержатся в файле conio.h (консольный ввод/вывод). Для их использования файл conio.h также следует подключить к программе с помощью директивы #include .
Функция printf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный вывод. Ее можно записать в следующем формальном виде:
рrintf ("управляющая строка", аргумент _1, аргумент _2,...);
Управляющая строка содержит компоненты трех типов: обычные символы, которые просто копируются в стандартный выходной поток (выводятся на экран дисплея); спецификации преобразования, каждая из которых вызывает вывод на экран очередного аргумента из последующего списка; управляющие символьные константы.
Каждая спецификация преобразования начинается со знака % и заканчивается некоторым символом, задающим преобразование. Между знаком % и символом преобразования могут встречаться другие знаки в соответствии со следующим форматом:
% [признаки] [ширина_поля] [точность] [F|N|h|l|L] c_n
Все параметры в квадратных скобках не являются обязательными.
На месте параметра c_n (символ преобразования) могут быть записаны:
с
d
i
е
Е
f
g
G
о
s
u
х
X
р
n
Необязательные параметры в спецификации преобразования:
Если после знака % записан не символ преобразования, то он выводится на экран. Таким образом, строка %% приводит к выводу на экран знака %.
Функция printf( ) использует управляющую строку, чтобы определить, сколько всего аргументов и каковы их типы. Аргументами могут быть переменные, константы, выражения, вызовы функций; главное, чтобы их значения соответствовали заданной спецификации.
При наличии ошибок, например, в числе аргументов или типе преобразования, результаты будут неверными.
Среди управляющих символьных констант наиболее часто используются следующие:
Например, в результате вызова функции:
printf("\tComputer\n%d\n", i);
сначала выполняется горизонтальная табуляция (\t), т.е. курсор сместится от края экрана, затем на экран будет выведено слово Computer, после этого курсор переместится в начало следующей строки (\n), затем будет выведено целое число i по формату %d (десятичное целое), и, окончательно, курсор перейдет в начало новой строки (\n).
Напечатать строку символов можно и так:
printf("Это строка символов");
Функция scanf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:
scanf("управляющая строка", аргумент_1, аргумент_2,...);
Аргументы scanf( ) должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет рассмотрено далее.
Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:
Рассмотрим символы преобразования функции scanf( ) (указываются после символа %):
с
d
i
D
l
е
Е
f
g
G
о
О
s
х
Х
р
n
u
U
Перед некоторыми символами преобразования могут записываться следующие модификаторы:
F
N
h
l
L
Ввести целое число (int a;), символ (char b;) и вещественное число (float t;) можно так:
scanf("%d", &a); scanf("%c", &b); scanf("%d%c%f",&a, &b, &t);
На этом все! Теперь вы знаете все про основные понятия языка си, Помните, что это теперь будет проще использовать на практике. Надеюсь, что теперь ты понял что такое основные понятия языка си, данные языка си и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Алгоритмизация и программирование. Структурное программирование. Язык C
Комментарии
Оставить комментарий
Алгоритмизация и программирование. Структурное программирование. Язык C
Термины: Алгоритмизация и программирование. Структурное программирование. Язык C