
- •Лекция №2
- •5. Операции и Выражения
- •Lvalues и Rvalues выражения
- •Унарные, бинарные и тернарное выражения
- •Приоритеты операций и порядок вычислений
- •Арифметические преобразования при вычислении выражений
- •5.1. Мультипликативные и аддитивные операции
- •Мультипликативные операции
- •Аддитивные операции
- •5.2. Операции отношения
- •Операции сравнения
- •Операции равенства
- •5.3.Логические операции
- •Второй операнд логической операции и и или вычисляется только, если это необходимо для определения результата. Операция логическое и
- •Операция логическое или
- •Операция логическое не
- •5.4. Побитовые операции
- •Операции сдвига
- •Операция побитовое и
- •Операция побитовое исключающее или
- •Операция побитовое включающее или
- •Операция побитового отрицания не
- •Отличие логических операций от логических побитовых операций
- •5.5. Операция последовательного вычисления
- •5.6. Операции присваивания
- •Простое присваивание
- •Составное присваивание
- •Побочные эффекты
- •5.7. Адресные операции
- •Операция разадресации
- •Операция взятия адреса
- •5.8. Операция sizeof
- •5.9. Условная операция
- •5.10. Операции преобразования типов
- •5.11 Особые операции
5.5. Операция последовательного вычисления
Операция последовательного вычисления( «запятая») может использоваться для помещения сложного выражения в круглые скобки. Выражения будут вычисляться слева направо, все выражение примет значение последнего вычисленного Тип и значение результата являются типом и значением правого операнда.
Форма записи:
выражение , выражение
Например, если имеются две переменные Т и Х, обе типа int, тогда выражение
P=(Т=3,Х=Т+2)
производит следующие действия: переменной Т присваивается значение 3, затем к 3 прибавляется 2, и полученное значение присваивается переменной Х, затем все выражение P принимает значение переменной Х.
5.6. Операции присваивания
Есть много операций присваивания, все они группируют слева направо. Все в качестве левого операнда требуют lvalue, и тип выражения присваивания тот же, что и у его левого операнда. Это lvalue не может ссылаться на константу (имя массива, имя функции или const). Значением является значение, хранящееся в левом операнде после выполнения присваивания.
Форма записи:
ИдентификаторПеременной ОперацияПрисваивания Выражение
ОперацииПрисваивания:
= += -= *= /= %= >>= <<= &= ~= |=
При присваиваниях осуществляется преобразование типов; значение правой части преобразуется к типу левой, который и является типом результата (см. арифметические преобразования) . Символьные переменные преобразуются в целые либо со знаковым расширением, либо без него, как описано выше. Обратное преобразование int в char ведет себя хорошо - лишние биты высокого порядка просто отбрасываются. Таким образом
int i;
char c;
. . .
i = c;
c = i;
значение 'c' не изменяется. Это верно независимо от того, вовлекается ли знаковое расширение или нет.
Если x типа float, а i типа int, то как
x = i;
так и
i = x;
приводят к преобразованиям; при этом float преобразуется в int отбрасыванием дробной части. Тип double преобразуется во float округлением. Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания лишних битов высокого порядка.
Простое присваивание
Операция простого присваивания’ = ’ используется для замены значения левого операнда, значением правого операнда. При присваивании производится преобразование типа правого операнда к типу левого операнда по правилам, упомянутым раньше. Левый операнд должен быть модифицируемым.
Пример:
int t;
char f;
long z;
t=f+z;
Значение переменной f преобразуется к типу long, вычисляется f+z ,результат преобразуется к типу int и затем присваивается переменной t.
Составное присваивание
Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют вид:
ИдентификаторПеременной БинарнаяОперация = Выражение
Допустимые БинарныеОперации:
+ - * / % >> << & ~ |
Составное присваивание по результату эквивалентно следующему простому присваиванию:
ИдентификаторПеременной = Выражение1 БинарнаяОперация Выражение2.
Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды.
Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций (+=) (-=) может быть указатель, в то время как правый операнд должен быть целым числом.
Примеры:
double a=5.2;
double b=3.0;
b+=a; /* эквивалентно b=b+a */
a/=b+1; /* эквивалентно a=a/(b+1)*/
a-=4; /* эквивалентно a=a-4*/
Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.
Самостоятельная проработка: