- •лекция 4
- •План лекции
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Выражения и подвыражения
- •Классы, приоритеты и ассоциативность операций
- •Классы, приоритеты и ассоциативность операций
- •Приоритеты операций в
- •Приоритеты операций в
- •Приоритеты операций в языке Си
- •Выражения и подвыражения
- •Выражения l-value
- •Выражения l-value
- •Выражения l-value
- •Выражения l-value
- •Точки следования, побочные эффекты
- •Точки следования, побочные эффекты
- •Точки следования, побочные эффекты
- •Точки следования, побочные эффекты
- •Точки следования, побочные эффекты
- •Точки следования, побочные эффекты
- •Неявные преобразования типов
- •Неявные преобразования
- •Неявные преобразования чисел
- •Неявные преобразования чисел
- •Неявные преобразования чисел
- •Неявные преобразования чисел
- •Неявные преобразования указателей
- •Неявные преобразования указателей
- •Неявные преобразования указателей
- •Явные преобразования указателей
- •Заключение
Выражения и подвыражения
<постфиксное-выражение>::= <первичное-выражение>
| <постфиксное-выражение> '[' <выражение> ']'
|<постфиксное-выражение>
|
|
point.x |
| |
'(' [<список-аргументов-выражений>] ')' |
|
<постфиксное-выражение> '.' |
point->x |
|
<идентификатор> |
i++ |
|
| |
<постфиксное-выражение> '->' |
i-- |
<идентификатор> |
|
|
| |
<постфиксное-выражение> '++' |
|
| |
<постфиксное-выражение> '--' |
|
Выражения и подвыражения
<первичное-выражение>::= |
|
|
|
<идентификатор> |
x |
| |
<константа> |
1.25f |
| |
<строка> |
"ABCDEF" |
| |
'(' <выражение> ')' |
(x+y) |
Выражения и подвыражения
<константа>::= <целая-константа>
| <символьная-константа> | <константа-с-плавающей- точкой>
| <константа-перечисление>
Выражения и подвыражения
<список-аргументов- выражений>::=
<выражение-присваивания> | <список-аргументов-выражений> ','
<выражение-присваивания>
Классы, приоритеты и ассоциативность операций
языкаОперацииСи Си делятся на 5 классов по числу и расположению
аргументовЗапись одной операции состоит из
Класс ЧислонесколькихПоложение
аргументов операции отн. аргументов
Атомарные |
0 |
|
Префиксны |
1 |
Перед |
е |
|
|
Постфиксн |
1 |
После |
ые |
|
|
Бинарные |
2 |
Между |
Классы, приоритеты и ассоциативность операций
языкаВ сложных выраженияхСи операции связываются с аргументами по убыванию их приоритетов
Приоритеты задаются целыми числами
Пример
Приоритет * = 13, приоритет + = 12 ==> x*x+y*y -- это (x*x)+(y*y), а не x*(x+y)*y и не (x*x+y)*y и не x*(x+y*y)
Порядок связывания с аргументами может отличаться от порядка выполнения операций из-за компиляторных оптимизирующих преобразований
Ассоциативность операции – порядок связывания с аргументами для операций одного приоритета
Слева направо, справа налево, без ассоциативности
Пример
Так как ассоциативность / "слева направо", x/y*z – это (x/y)*z, а не x/ (y*z)
Операция без ассоциативности подряд + что-то ещё -- синтаксическая ошибка – например, k++ k--
Приоритеты операций в
языке |
|
-т |
Лексемы Операция |
Класс |
Приор |
|
Переменн
ые
Константы
a[k]
f(…)
.
->
k++ k-- ++k --k
sizeof
Значение константы или доступ к переменной
Доступ к элементу массива
Вызов функции
Доступ к полю структуры или объединения
Доступ к полю структуры или объединения через указатель
Доступ к значению k и послед. увеличение или уменьшение k на 1
Увеличение или уменьшение k на 1 и послед. доступ к полученному значению k
Размер значения или типа в байтах
~ |
Побитовое НЕ |
атомарны
й
постфиксн
ый
постфиксн
ый
постфиксн
ый
постфиксн
ый
постфиксн
ый
префиксн
ый
префиксн
ый
префиксн
ый
16
16
16
16
16
16
15
15 15
Ассоц- ность
нет
слева
направо
слева
направо
слева
направо
слева
направо
слева
направо
справа
налево
справа
налево
справа
налево
Приоритеты операций в
языке Си |
Класс |
-т |
Лексемы Операция |
|
Приор |
|
|
*
(имя типа)
* / %
+ -
<< >>
< > <= >=
== !=
&
^
|
&&
|| с ? в1 : в2
Доступ через указатель
Явное изменение (преобразование) типа
Умножение, деление, остаток от деления
Сложение, вычитание чисел
Сдвиг влево или вправо в 2 с.с.
Сравнение чисел
Проверка равенства и различия
Побитовое И
Побитовое исключающее ИЛИ
Побитовое ИЛИ
Логическое И
Логическое ИЛИ
в1 (если с != 0) или в2 (если с == 0)
префиксн |
15 |
|
ый |
|
|
префиксн |
14 |
|
ый |
|
|
бинарный |
13 |
|
бинарный |
12 |
|
бинарный |
11 |
|
бинарный |
10 |
|
бинарный |
9 |
|
бинарный |
8 |
|
бинарный |
7 |
|
бинарный |
6 |
|
бинарный |
5 |
|
бинарный |
4 |
|
тернарны |
3 |
|
й |
||
|
Ассоциативн
ость
справа налево
справа налево
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо справа налево
Приоритеты операций в языке Си
Лексемы
= += -= *= /= %= <<= >>= &= ^= |=
,
Операция
Вычисление правого аргумента и послед. запись полученного значения в ячеку памяти, определяемую левым аргументом (присваивание)
Последовательное вычисление аргументов
Класс |
Приор |
Ассоц- |
|
-т |
ность |
||
|
бинарн |
2 |
справа |
|
ый |
налево |
||
|
бинарн |
1 |
слева |
|
ый |
направо |
||
|
Выражения и подвыражения
Классы, приоритеты и ассоциативность операций языка Си
Далее
Выражения l-value
Порядок вычисления выражений, точки следования, побочные эффекты
Неявные преобразования типов
