Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
255.49 Кб
Скачать

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*/

Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.

Самостоятельная проработка:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]