Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Glava_2.doc
Скачиваний:
38
Добавлен:
18.11.2019
Размер:
1.09 Mб
Скачать

Операторы присваивания

Вы уже познакомились с оператором присваивания, а теперь, так как вы такие хорошие друзья, пора взглянуть поближе на важный символ, представленный одним знаком равенства (=). Рассмотрим следующий простой оператор, который присваивает значение В переменной А:

А = В; /* Присвоить значение В переменной А */

В результате выполнения этого оператора значение В не изменяется, а прежнее значение А исчезает, как туман в лучах солнца.

Строго говоря, А называется l - значением (lvalue), а В - г-значением (rvalue). В общем случае l - значение - это любое выражение, которое может стоять слева от знака равенства. В свою очередь г - значение — это любое выражение, которое может стоять справа от знака равенства. l - значение (в нашем случае А) должно ссылаться на объект, который может принимать значения, - обычно это ссылка на некоторую область памяти; г - значение представляет собой любое выражение, имеющее значение, но оно не обязано хранить его — это может быть и ссылка и литеральная константа. Выражение

А = 1234

вполне законно при условии, что А может хранить числовые значения. Выражение

1234 = А; /* ??? */

не имеет смысла (и не будет компилироваться), потому что литеральная константа (1234) не является l - значением.

Выражения значений

Выражения бывают разные - от очень простых до невероятно сложных. Простейшее выражение представ­ляет собой значение. Например, переменная А типа int является выражением, которое представляет значение переменной А. В действительности, все выражения имеют значения. Выражение (А + В) равно значению сум­мы слагаемых А и В.

Несмотря на то, что следующее утверждение может показаться странным, но, тем не менее, присваивания также являются выражениями и, подобно всем выражениям, имеют значения. Как вы уже знаете, выражение (А = В) присваивает значение В переменной А. Однако как выражение (А = В) также имеет значение, равное присваиваемому результату. Следовательно, выражение

С = (А = В)

полностью допустимо. Сначала заключенное в круглые скобки подвыражение (А = В) присваивает значение В переменной А. Затем значение этого подвыражения (равное А) присваивается переменной С. Таким образом, как С, так и А сейчас равны В. Можно даже обойтись без круглых скобок. Выражение

С = А = В

присваивает значение В переменным А и С.

Принимая это во внимание, возьмите на вооружение один из способов инициализации многих переменных. Выражение

С = А = В = 451

присваивает число 451 переменным А, В и С.

Сокращенный оператор присваивания

Операторы присваивания иногда выполняют больше работы, чем нужно. В операторе

А = А + 45;

компилятор генерирует код для вычисления выражения А + 45, результат которого затем присваивается, опять переменной А. Две ссылки на переменную А требуют двукратного вычисления адреса переменной А в памяти - один раз для нахождения исходного значения А, а затем для определения адреса, по которому нужно записать результат. То же самое выражение можно записать проще, а именно:

А += 45.

Эта запись поможет компилятору сгенерировать программный код более рационально. Двойной символ += на­зывается оператором присваивания. Эта сокращенная запись дает указание компилятору прибавить число 45 к значению А и запомнить результат опять-таки в переменной А. Вот полный набор операторов присваивания:

*=, /=, +=, -=, %=, «=, »=, &=, "= и |=.

Каждый из них (ор) позволяет свести символическую запись выражения (псевдокод)

i = i op j;

к более короткой записи

i ор= j;

Замечание

Псевдокод - это неформальный способ описания операторов без использования фактических элементов языка С (или другого языка). Обозначение оp, использованное в приведенных выше псевдооператорах, -это просто концептуальное обозначение, а не фактический оператор.

Следующие несколько примеров операторов присваивания для переменной count типа int демонстрируют, как работает сокращенная запись операторов (в комментариях даны эквивалентные полные формы):

count += 10; /* count = count + 10 */

count *= 2; /* count = count * 2 */

count /= 3; /* count = count / 3 */

count %= 16; /* count = count % 16 */

Такие оптимизирующие компиляторы, как Borland C++, способны генерировать эффективный програм­мный код и для эквивалентных полных выражений, но в сложных выражениях, где участвуют не такие про­стые переменные, как count, множественные ссылки на переменные могут снизить быстродействие программы. Используйте операторы присваивания, где только это возможно. Они ускорят выполнение программы.

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