Язык программирования Си для персонального компьютера
Шрифт:
Операции присваивания
В языке Си имеются следующие операции присваивания:
Операция | Действие |
++ | Унарный инкремент |
– - | Унарный декремент |
= | Простое присваивание |
*= | Умножение с присваиванием |
/= | Деление
|
%= | Остаток от деления с присваиванием |
+= | Сложение с присваиванием |
– = | Вычитание с присваиванием |
<<= | Сдвиг влево с присваиванием |
>>= | Сдвиг вправо с присваиванием |
&= | Поразрядное И с присваиванием |
|= | Поразрядное включающее ИЛИ с присваиванием |
^= | Поразрядное исключающее ИЛИ с присваиванием |
При присваивании тип правого операнда преобразуется к типу левого операнда. Специфика этого преобразования зависит от обоих типов и подробно описана в разделе 4.7.1. Левый (или единственный) операнд операции присваивания должен быть модифицируемым L-выражением (см. раздел 4.2.7).
Важное отличие присваивания в языке Си от операторов присваивания в других языках программирования состоит в том, что в языке Си операция присваивания вырабатывает значение, которое может быть использовано далее в вычислении выражения.
Операции инкремента и декремента
Операции ++ и -- инкрементируют (увеличивают на единицу) и декрементируют (уменьшают на единицу) свой операнд. Операнд должен иметь целый, плавающий тип или быть указателем. В качестве операнда допустимо только модифицируемое L-выражение.
Операнды целого или плавающего типа увеличиваются или уменьшаются на целую единицу. Над операндом не производятся преобразования по умолчанию. Тип результата соответствует типу операнда. Операнд типа указатель инкрементируется или декрементируется на размер объекта, который он адресует, по правилам, описанным в разделе 4.3.4. Инкрементированный указатель адресует следующий элемент данного типа, а декрементированный указатель—предыдущий.
Операции инкремента и декремента могут записываться как перед своим операндом (префиксная форма записи), так и после него (постфиксная форма записи). Для операции в префиксной форме операнд сначала инкрементируется или декрементируется, а затем его новое значение участвует в дальнейшем вычислении выражения, содержащего данную операцию. Для операции в постфиксной форме операнд инкрементируется лишь после того, как его старое значение участвует в вычислении выражения. Таким образом, результатом операций инкремента и декремента является либо новое, либо старое значение операнда.
Примеры:
/* пример 1 */
if(pos++ > 0) *p++ = *q++;
/* пример 2 */
if(line[--i] != '\n') return;
В
Во втором примере переменная i декрементируется перед ее использованием в качестве индекса массива line.
Простое присваивание
Операция простого присваивания обозначается знаком =. Значение правого операнда присваивается левому операнду. Левый операнд должен быть модифицируемым L-выражением. При присваивании выполняются правила преобразования типов, описанные в разделе 4.7.1.
Операция вырабатывает результат, который может быть далее использован в выражении. Результатом операции является присвоенное значение. Тип результата — тип левого операнда.
Пример 1:
double х;
int у;
х = у; Значение у преобразуется к типу double и присваивается х.
Пример 2:
int а, b, с; b = 2; a = b + (с = 5);
Переменной с присваивается значение 5, переменной а — значение b + 5, равное 7.
Составное присваивание
Операция составного присваивания состоит из простой операции присваивания, скомбинированной с какой-либо другой бинарной операцией. При составном присваивании вначале выполняется действие, специфицированное бинарной операцией, а затем результат присваивается левому операнду. Выражение составного присваивания со сложением, например имеет вид:
<выражение1> += <выражение2>
Оно может быть записано и таким образом:
<выражение1> = <выражение1> + <выражение2>
Значение операции вырабатывается по тем же правилам, что и для операции простого присваивания. Однако выражение составного присваивания не эквивалентно обычной записи, поскольку в выражении составного присваивания <выражение1> вычисляется только один раз, в то время как в обычной записи оно вычисляется дважды: в операции сложения и в операции присваивания. Например, оператор
*str1.str2.ptr += 5;
легче для понимания и выполняется быстрее, чем оператор
*str1.str2.ptr = *str1.str2.ptr + 5;
Использование составных операций присваивания может повысить эффективность программ. Каждая операция составного присваивания выполняет преобразования, которые определяются входящей в ее состав бинарной операцией, и соответственно ограничивает типы своих операндов. Результатом операции составного присваивания является значение, присвоенное левому операнду. Тип результата — тип левого операнда.