Выражения языка С презентация

Содержание

План лекции Классы, приоритеты и ассоциативность операций языка Си Выражения l-value Порядок вычисления выражений, точки следования, побочные эффекты Выражения и подвыражения Неявные преобразования типов

Слайд 1Выражения языка С
лекция 4


Слайд 2План лекции
Классы, приоритеты и ассоциативность операций языка Си
Выражения l-value
Порядок вычисления выражений,

точки следования, побочные эффекты
Выражения и подвыражения
Неявные преобразования типов

Слайд 3Обзор операций языка Си 1/3
Операции Си делятся на 5 классов по

числу и расположению аргументов
Запись одной операции состоит из одной или нескольких лексем

Слайд 4Обзор операций языка Си 2/3
Операции связываются с аргументами по возрастанию своих

приоритетов
Приоритеты задаются целыми числами

Слайд 5Обзор операций языка Си 3/3
Ассоциативность бинарных операций задает расстановку скобок в

выражениях, содержащих операции одного приоритета
Левоассоциативные -- слева направо
Правоассоциативные -- справа налево
Операции языка Си одного приоритета имеют одинаковую ассоциативность
Иначе расстановка скобок неоднозначна



Слайд 6Приоритеты операций в языке Си


Слайд 7Приоритеты операций в языке Си


Слайд 8Приоритеты операций в языке Си


Слайд 9Первичные выражения
Идентификатор переменной или функции
Константа
Строковый литерал (является lvalue)
Выражение, взятое в круглые

скобки

Слайд 10Доступ к элементу массива
A[k]
A


Слайд 11Выражения и подвыражения
::=

| ','

::=

|

::= '='

| '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|='

Слайд 12Выражения и подвыражения
::=

| '?' ':'

::=

::=

| '||'


Слайд 13Выражения и подвыражения
::= | '&&'

::= | '|'

::= | '^'


Слайд 14Выражения и подвыражения
::= | '&'

::= | '==' | '!='


Слайд 15Выражения и подвыражения
::= | '' | '='
x >> 2
x

y < z << 2
(x < y) < (z << 2)


Слайд 16Выражения и подвыражения
::= | '>>' | '

+ y
x >> y+z

x << (y+z)

x * y x + y + z
x - y - z

Слайд 17Выражения и подвыражения
::= | '*' | '/' | '%'
(double)x
x * y

(x / y)

/ z

x % y

Слайд 18Выражения и подвыражения
::= | '(' ')' ::= | '++' | '--' | | 'sizeof' | 'sizeof' '('

')'
<унарный-оператор>::= '&' | '*' | '+' | '-' | '~' | '!'

&x
(int*) &x

x++
++(x--)
--(x++)
* (int*) &x

sizeof(x)
sizeof(int)


Слайд 19Выражения и подвыражения
::= | '[' ']' | '(' [] ')' | '.' |

'->' <идентификатор> | <постфиксное-выражение> '++' | <постфиксное-выражение> '--'

x
A[x]
f (x, y)

point.x
point->x
i++
i--


Слайд 20Выражения и подвыражения
::= | | | '(' ')'

x
1.25f
"ABCDEF"
(x+y)


Слайд 21Выражения и подвыражения
::= | | |


Слайд 22Выражения и подвыражения
::=
| ','


Слайд 23
Выражения и подвыражения
Классы, приоритеты и ассоциативность операций языка Си
Далее
Выражения l-value
Порядок вычисления

выражений, точки следования, побочные эффекты
Неявные преобразования типов


Слайд 24Выражения l-value
Ошибка или нет:
(A[i] < A[j] ? A[i] : A[j]) =

1 // min(A[i], A[j]) заменить на 1
A[ A[i] < A[j] ? i : j ] = 1

Выражения языка Си, значениям которых гарантированно соответствует ячейка памяти, называются l-value

Значениям, которые хранятся только в регистрах процессора, не соответствует никакая ячейка памяти

Только 5 видов выражений в языке Си являются l-value – см. след. слайд
Остальные виды выражений – не l-value

Слайд 25Выражения l-value
l-value получаются при следующих операциях
Доступ к значению переменной
Доступ через указатель

*
Доступ к элементу массива a[k]
Доступ к полю структуры или объединения student.name
Доступ к полю структуры или объединения через указатель pstudent->name

Все остальные операции дают выражения, не являющиеся l-value

Слайд 26Выражения l-value
Операции, требующие l-value
Левый аргумент во всех видах присваивания =, +=

и т.п.
Взятие адреса &
Префиксные и постфиксные ++ и --


Слайд 27Выражения l-value
Пример 1
int x; x = 2; // x – l-value int

A[10]; A[5] = 5+x; // A[5] – l-value, 5+x – не l-value

Пример 2
int x, y; (x < y ? x : y) = 1; // ошибка, т.к. (x < y ? x : y) не l-value *(x < y ? &x : &y) = 1; // ОК, т.к. *(x < y ? &x : &y) – l-value

Пример 3
(A[i] < A[j] ? A[i] : A[j]) = 1; // ошибка A[ A[i] < A[j] ? i : j ] = 1; // ОК


Слайд 28Точки следования, побочные эффекты
Побочный эффект вычисления выражения – это факт изменения

содержимого ячеек памяти в процессе вычисления выражения
Присваивание
x = 1;
Сложный побочный эффект
i = 0; A[i++] = i++; // чему равно i – 0 или 1?
В каком порядке выполнятся = и ++?

Слайд 29Точки следования, побочные эффекты
Точка следования (sequence point) -- точка программы, в

которой гарантируется, что все побочные эффекты предыдущих вычислений уже проявились, а побочные эффекты последующих ещё отсутствуют

Слайд 30Точки следования, побочные эффекты
Между вычислением левого и правого аргументов в операциях

&&, || и , (запятая)
Между вычислением первого и второго или третьего аргументов в операции ?:
В конце всего выражения
Перед входом в вызываемую функцию
В объявлении с инициализацией на момент завершения вычисления инициализирующего значения
В остальном порядок выполнения операций определяет компилятор

Слайд 31Точки следования, побочные эффекты
Пример 1
while (*p++ != 0 && *q++ !=

0) *p = *q;

Все побочные эффекты *p++ != 0 проявятся до начала вычисления *q++ != 0
Правило 1
Все побочные эффекты *p++ != 0 и *q++ != 0 проявятся до начала вычисления *p = *q
Правило 3
Что делает этот цикл while?



Слайд 32Точки следования, побочные эффекты
Пример 2
int A[3] = {1,0,2}, *p = A;
int

a = (*p++) ? (*p++) : 0; // чему равно a?

Точка следования находится после первого *p++
p уже увеличена на 1 при вычислении второго *p++

Слайд 33Точки следования, побочные эффекты
Пример 3
int i = 0, j = i++,

k = i++;
int x = f(i++) + g(j++) + h(k++);

Каждая из переменных i, j и k принимает новое значение перед входом в f, g и h соответственно
Порядок вызова функций f(), g(), h() неопределён
Порядок инкремента i, j, k неопределён
Если i, j и k – глобальные переменные, то значения j и k неопределены внутри f, значения i и k неопределены внутри g, значения i и j неопределены внутри h

Слайд 34Неявные преобразования типов
Над числами
Над указателями
Других нет


Слайд 35Неявные преобразования чисел
Если какой-либо из аргументов имеет тип long double, то

другой приводится к long double
В противном случае, если какой-либо из аргументов имеет тип double, то другой приводится к double
В противном случае, если какой-либо из аргументов имеет тип float, то другой приводится к float
В противном случае для обоих аргументов осуществляется целочисленное повышение; затем, если один из аргументов имеет тип unsigned long int, той другой преобразуется в unsigned long int
В противном случае, если один из аргументов принадлежит типу long int, а другой -- unsigned int, то результат зависит от того, покрывает ли long int все значения unsigned int
Если это так, то unsigned int приводится к long int
Если нет, то оба аргумента преобразуются в unsigned long int
В противном случае, если один из аргументов имеет тип long int, то другой приводится к long int
В противном случае, если один из аргументов -- unsigned int, то другой приводится к unsigned int
В противном случае оба аргумента имеют тип int
Подробно о каждом преобразовании см. след. слайды


Слайд 36Неявные преобразования чисел
Целочисленное повышение

Значения типов enum, signed char, short int, unsigned

char, unsigned short int автоматически преобразуются в int (если значение представимо как int) или в unsigned int (в противном случае)

Для всех известных компиляторов enum, char, short int представимы как int

Слайд 37Неявные преобразования чисел
Целочисленные преобразования из типа со знаком ST в тип

без знака UT
Если sizeof(ST) == sizeof(UT), то битовое представление не меняется
Если sizeof(ST) < sizeof(UT), то битовое представление со знаком дополняется старшими нулями
Если sizeof(ST) > sizeof(UT), то старшие разряды отбрасываются
Целочисленные преобразования из типа без знака UT в тип со знаком ST
Если sizeof(ST) >= sizeof(UT), то битовое представление не меняется
Если sizeof(ST) < sizeof(UT), то результат зависит от компилятора

Слайд 38Неявные преобразования чисел
Преобразования целые числа с плавающей точкой
С плавающей точкой

--> целое
Дробная часть отбрасывается
int x = (int)1.25; // x == 1
Если полученное значение выходит из диапазона целого типа, то результат неопределен
int x = (int)1e20; // рез-т неопределён
Целое --> с плавающей точкой
Если целое входит в диапазон типа с плавающей, но представляется неточно, то одно из двух ближайших значений с плавающей
Если выходит из диапазона типа с плавающей, то результат неопределен

Слайд 39Неявные преобразования чисел
Преобразования чисел с плавающей точкой из типа F1 в

F2
Если sizeof(F1) <= sizeof(F2), то значение не меняется (но может измениться битовое представление)
Если sizeof(F1) > sizeof(F2) и входит в диапазон F2, то одно из двух ближайших значений
Если sizeof(F1) > sizeof(F2) и не входит в диапазон F2, то неопределено



Слайд 40Неявные преобразования указателей
В операциях присваивания и сравнения целочисленное константное выражение со

значением 0 автоматически преобразуется в указатель любого типа

Результатом преобразования 0 в указатель является NULL, отличный от всех остальных указателей
NULL не соответствует ни одной ячейке памяти

Слайд 41Неявные преобразования указателей
В операциях присваивания и сравнения указатель на значение типа

T автоматически преобразуется в указатель на значение типа const T и на значение типа volatile T

Слайд 42Неявные преобразования указателей
Указатель типа void * автоматически преобразуется к указателю любого

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



Слайд 43Явные преобразования указателей
Для указателей допускаются и другие преобразования, но в связи

с ними возникает проблема зависимости результата от реализации. Эти преобразования должны быть специфицированы явным оператором преобразования типа или оператором приведения
Указатель можно привести к целочисленному типу, достаточно большому для его хранения; требуемый размер зависит от реализации. Функция преобразования также зависит от реализации
Объект целочисленного типа можно явно преобразовать в указатель. Если целое получено из указателя и имеет достаточно большой размер, это преобразование даст тот же указатель; в противном случае результат зависит от реализации
Указатель на один тип можно преобразовать в указатель на другой тип. Если исходный указатель ссылается на объект, должным образом не выровненный по границам слов памяти, то в результате может произойти ошибка адресации. Если требования на выравнивание у нового типа меньше или совпадают с требованиями на выравнивание первоначального типа, то гарантируется, что преобразование указателя в другой тип и обратно его не изменит; понятие "выравнивание" зависит от реализации, однако в любой реализации объекты типа char предъявляют минимальные требования на выравнивание.
Указатель может быть преобразован в другой указатель того же типа с добавлением или удалением квалификаторов того типа объекта, на который этот указатель показывает. Новый указатель, полученный добавлением квалификатора, имеет то же значение, но с дополнительными ограничениями, внесенными новыми квалификаторами. Операция по удалению квалификатора у объекта приводит к тому, что восстанавливается действие его начальных квалификаторов, заданных в объявлении этого объекта.
Наконец, указатель на функцию может быть преобразован в указатель на функцию другого типа. Вызов функции по преобразованному указателю зависит от реализации; однако, если указатель еще раз преобразовать к его исходному типу, результат будет идентичен вызову по первоначальному указателю.

Слайд 44Заключение
Выражения и подвыражения
Классы, приоритеты и ассоциативность операций языка Си
Выражения l-value
Порядок вычисления

выражений, точки следования, побочные эффекты
Неявные преобразования типов


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика