
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Операции языка Си. Приоритет операций
Операции языка Си и их приоритеты приведены в следующей таблице:
Прио-ритет |
Операция |
Название |
Порядок выполнения |
1 |
() |
Скобки, вызов функции |
Слева направо |
[] |
Квадратные скобки, выделение элемента массива |
Слева направо | |
. |
Выделение элемента структуры или объединения |
Слева направо | |
–> |
Выделение элемента структуры (объединения), адресуемой (го) указателем |
Слева направо | |
2 |
! |
Логическое отрицание |
Справа налево |
~ |
Побитовое отрицание |
Справа налево | |
– |
Изменение знака |
Справа налево | |
+ + |
Увеличение на единицу |
Справа налево | |
– – |
Уменьшение на единицу |
Справа налево | |
& |
Определение адреса |
Справа налево | |
* |
Обращение по адресу (содержимое адреса), разыменование |
Справа налево | |
(тип) |
Преобразование типа |
Справа налево | |
sizeof |
Определение размера в байтах |
Справа налево | |
3 |
* |
Умножение |
Слева направо |
/ |
Деление |
Слева направо | |
% |
Остаток от деления |
Слева направо | |
4 |
+ |
Сложение |
Слева направо |
– |
Вычитание |
Слева направо | |
5 |
<< |
Сдвиг влево |
Слева направо |
>> |
Сдвиг вправо |
Слева направо | |
6 |
< |
Меньше |
Слева направо |
<= (!=>) |
Меньше или равно |
Слева направо | |
> |
Больше |
Слева направо | |
>= (!<) |
Больше или равно |
Слева направо | |
7 |
= = |
Равно |
Слева направо |
!= |
Не равно |
Слева направо | |
8 |
& |
Поразрядное И |
Слева направо |
9 |
^ |
Исключающее ИЛИ |
Слева направо |
10 |
| |
Поразрядное ИЛИ |
Слева направо |
11 |
&& |
Логическое И |
Слева направо |
12 |
|| |
Логическое ИЛИ |
Слева направо |
13 |
?: |
Условная операция |
Справа налево |
14 |
= |
Присваивание |
Справа налево |
*= |
Умножение и присваивание |
Справа налево | |
/= |
Деление и присваивание |
Справа налево | |
%= |
Остаток и присваивание |
Справа налево | |
+= |
Сложение и присваивание |
Справа налево | |
– = |
Вычитание и присваивание |
Справа налево | |
<<= |
Сдвиг влево и присваивание |
Справа налево | |
>>= |
Сдвиг вправо и присваивание |
Справа налево | |
&= |
Поразрядное И и присваивание |
Справа налево | |
^= |
Исключающее ИЛИ и присваивание |
Справа налево | |
|= |
Поразрядное ИЛИ и присваивание |
Справа налево | |
15 |
, |
Операция запятая |
Слева направо |
Операция присваивания
a = b;
a <op> = b;
a = b = c;
Особенностью операции присваивания в Си является то, что она рассматривается как обычная операция, которая может участвовать в выражении (со своим приоритетом) и вызывает не только некоторые действия, но и дает значение (то, что справа от знака равенства) в качестве результата. Это значение затем может использоваться другими операциями.
С учетом сказанного следующая запись является корректной:
a=b=c=d=1;
<---------
Все присваивания имеют одинаковый приоритет и выполняются справа налево:
(a=(b=(c=(d=1))));
Здесь выражение (d=1) имеет значение 1, которое используется при присваивании. Т.о. строка присваиваний может быть рассмотрена как
d=1;
c=1;
b=1;
a=1;
Указанная особенность операции присваивания позволяет предельно кратко записывать громоздкие вычисления:
s1=a+b; |
s2=c+d; |---> s3 = ( s1=a+b ) + ( s2=c+d );
s3=s1+s2; | -----------------------
|__здесь мы искусственно повысили
приоритет операции присваивания
при помощи скобок
Си позволяет общее выражение вида A = A <op> B,
где <op> любая бинарная операция (кроме && и ||), заменять на А <op> = В.
Так, например, вместо А=А*В, вы можете написать А*=В.
При этом следует учитывать, что в краткой записи значение переменной вычисляется лишь один раз, тогда как в полной записи - два раза. Это бывает важно помнить в случаях, аналогичных данному
краткая форма
a[i++] += 2 --> это эквивалентно a[i]=a[i] +2; i++
---
|___постфиксная форма, т.е. порядок вычисления следующий: сначала a[i], а потом i++
полная форма
a[i] = a[i++] +2;