Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Операция присваивания. Формат операции присваивания:
Формат операции присваивания: идентификатор = < выражение >; Присваивание значения в языке Cи в отличие от традиционной интерпретации рассматривается как выражение имеющее значение левого операнда после присваивания. Таким образом, присваивание может включать несколько операций присваивания, изменяя значения нескольких операндов, например: int i, j, k; float x, y, z; ... i = j = k = 0; ↔ k = 0, j = k, i = j; x = i +(y = 3) - (z = 0); ↔ z = 0, y = 3, x = i + y - z; Левым операндом операции присваивания может быть только именованная либо косвенно адресуемая указателем переменная. Примеры недопустимых выражений: а) присваивание константе: 2 = x+y; б) присваивание функции: getch () = i; в) присваивание результату операции: (i +1) = 2+ y; В языке Cи используются два вида сокращений записи операции присваивания: a) вместо записи v = v # e; где # - арифметическая операция (операция над битовым представлением операндов), рекомендуется использовать запись v #= e; например, i = i + 2; ↔ i += 2; (знаки операций без пробелов); б) вместо записи x = x # 1; где # - символы, обозначающие операцию инкремента (+), либо декремента (-), x - целочисленная переменная (переменная-указатель), рекомендуется использовать запись: ## x; - префиксную или x ##; - постфиксную. Если эти операции используются в чистом виде, то различий между постфиксной и префиксной формами нет. Если же они используются в выражении, то в префиксной форме (##x) сначала значение x изменится на 1, а затем будет использовано в выражении; в постфиксной форме (x##) сначала значение используется в выражении, а затем изменяется на 1. Операции над указателями рассмотрим позже. Пример 1: Пример 2: int i, j, k; Смысл записи int n, a, b, c, d; Значения float x, y; n = 2; a = b = c = 0; ... a = ++n; n=3, a=3 x* = y; x = x*y; a+ = 2; a=5 i+ = 2; i = i+2; b = n++; b=3, n=4 x/ = y+15; x = x/(y+15); b- = 2; b=1 --k k = k-1; c = --n; n=3, c=3 --k k = k-1; c* = 2; c=6 j = i++; j = i; i = i+1; d = n--; d=3, n=2 j = ++i; i = i+1; j = i; d% = 2; d=1 В операциях могут участвовать операнды различных типов, в этом случае они преобразуются к общему типу в порядке увеличения их " размера памяти", т.е. объема памяти, необходимого для хранения их значений. Поэтому неявные преобразования всегда идут от " меньших" объектов к " большим". Схема выполнения преобразований операндов арифметических операций: short, char → int → unsigned → long → double float → double Стрелки отмечают преобразования даже однотипных операндов перед выполнением операции, т.е. действуют следующие правила: - значения типов char и shor t всегда преобразуются в int; - если любой из операндов (a или b) имеет тип double, то второй преобразуется в double; - если один из операндов long, то другой преобразуется в long. Результатом 1/3 будет «0», чтобы избежать такого рода ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. записывать, например: 1. / 3. Типы char и int могут свободно смешиваться в арифметических выражениях. Каждая переменная типа char автоматически преобразуется в int, что обеспечивает значительную гибкость при проведении определенных преобразований символов. При присваивании значение правой части преобразуется к типу левой, который и является типом результата. И здесь необходимо быть внимательным, т.к. при некорректном использовании операций присваивания могут возникнуть неконтролируемые ошибки. Так, при преобразовании int в char старший байт просто отбрасывается. Пусть имеются значения: float x; int i; тогда x=i; и i=x; приводят к преобразованиям, причем float преобразуется в int сотбрасыванием дробной части. Тип double преобразуется во float округлением. Длинное целое преобразуется в более короткое целое и char посредством отбрасывания лишних бит более высокого порядка. При передаче данных функциям также происходит преобразование типов: в частности, char становится int, а float - double.
|