- •Действия: что делает программа Глава 2 Выражения
- •Арифметические операторы
- •Замечание
- •Операторы отношений
- •Логические операторы
- •Оператор отрицания
- •Операторы инкремента и декремента
- •Поразрядные операторы
- •Поразрядный оператор исключающего или
- •Сдвиг битов влево
- •Дополнение до единицы
- •Сомр 44 0х002с 0000000000101100
- •Операторы присваивания
- •Выражения значений
- •Приоритеты операторов
Операторы присваивания
Вы уже познакомились с оператором присваивания, а теперь, так как вы такие хорошие друзья, пора взглянуть поближе на важный символ, представленный одним знаком равенства (=). Рассмотрим следующий простой оператор, который присваивает значение В переменной А:
А = В; /* Присвоить значение В переменной А */
В результате выполнения этого оператора значение В не изменяется, а прежнее значение А исчезает, как туман в лучах солнца.
Строго говоря, А называется 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, множественные ссылки на переменные могут снизить быстродействие программы. Используйте операторы присваивания, где только это возможно. Они ускорят выполнение программы.
