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