ОПЕРАЦИИ И ВЫРАЖЕНИЯ

Выражения

Выражение состоит из одного или большего числа операндов и символов операций. Пример: а++ b = 10 х = (y*z)/w

Замечание. Выражение, заканчивающееся точкой с запятой, является оператором

Метаобозначения операндов

Некоторые операции требуют операндов определенного вида. Вид операнда обозначается одной из следующих букв:

е - любое выражение;

v - любое выражение, ссылающееся на переменную, которой может быть присвоено значение. Такие выражения называются адресными.

Префикс указывает тип выражения. Например, ie обозначает произвольное целое выражение. Далее описываются все возможные префиксы.

i - целое число или символ;

а - арифметическое выражение (целое число, символ или число с плавающей точкой);

р - указатель;

s - структура или объединение;

sp - указатель на структуру или объединение;

t - функция;

tp — указатель на функцию.

Обозначение япет указывает на имя элемента структуры или объединения.

Замечание. Если в выражении должно быть несколько операндов, то они отличаются номерами, например ael + ае2

Арифметические операции

+ Использование: ael + ае2 Сумма значений ael и ае2. Пример:

“=J+2;

Устанавливает i равным J плюс 2.

+ Использование: ре + ie Адрес переменной типа ре, больший на ie адреса, заданного указателем ре. Пример last = arname + arsize - 1, Присваивает переменной last адрес последнего элемента массива arname

— Использование: ael - ае2 Разность значений ael и ае2 Пример: 1=J-3,

- Использование: ре - ie Адрес переменной типа ре, меньший на ie адреса, заданного указателем ре. Пример first = last - Jisize + 1.

— Использование: pel - ре 2 Число переменных типа ре в диапазоне от ре2 до pel. Пример arsize = last - first.

- Использование: -ае Изменение знака ае. i Пример: Х= —X,

* Использование: ael * ае2 Произведение значений ael и ае2 Пример: z= 3 *х.

/ Использование: ael / ае2. Частное от деления ael на ае2. Пример: l=J/5.

% Использование: ael % ае2 Остаток от деления (деление по модулю) ael на ае2. Пример: minutes =s time % 60,

Замечание при выполнении операций ++ и - — появляется побочный эффект — изменяется значение переменной, используемой в качестве операнда ++

Использование: iv++

Увеличение iv на 1 Значением этого выражения является значение iv до увеличения. Пример: J=l++;

++ Использование: pv++ Увеличение указателя pv на 1, так что он будет указывать на следующий объект того же типа Значением этого выражения является значение pv до увеличения. Пример: *ptr++ =: 0;

Присвоить значение 0 переменной, на которую указывает ptr, затем увеличить значение указателя ptr так, чтобы он указывал на следующую переменную того же типа.

++ Использование: ++iv Увеличение iv на 1 Значением этого выражения является значение iv после увеличения. Пример: 1=++J.

++ Использование: ++pv Увеличение pv на 1 Значением этого выражения является зна чение pv после увеличения. Пример: *++ptr = 0;

—- Использование: iv— Уменьшение iv на 1 Значением этого выражения является значение iv до уменьшения. Пр имер J= 1—.

— Использование: pv— Уменьшение указателя pv на 1 так, что он будет указывать на предыдущий объект того же типа Значением этого выражения является значение pv до уменьшения. Пример: arrpos= р--.

— Использование: —iv Уменьшение iv на 1. Значением этого выражения является значение iv после уменьшения. Пример: i= --J.

Использование: —pv Уменьшение pv на- 1 Значением этого выражения является значение pv после уменьшения. Пример:     prepos= --р.

Операция присваивания

Замечание Значением выражения, в которое входит операция присваивания, является значение левого операнда после присваивания.

= Использование: v = e Присваивание значения е переменной v. Пример: х= у;

Замечание. Следующие операции объединяют арифметические или побитовые операции с операцией присваивания

+= Использование: av += ae  Увеличение av на ae Пример: у+=2; Увеличение переменной у на 2.

+= Использование: pv += ie Увеличение pv на ie. Пример: р+= п,

-= Использование: av -= ae Уменьшение av на ae. Пример: х-=3;

-= Использование: pv -= ie Уменьшение pv на ie. Пример: ptr -= 2;

*= Использование: av *= ae Умножение av на ae. Пример: timesx *= х;

/= Использование: av /= ae Деление av на ae. Пример: х/=2;

%= Использование: iv %= ie Значение iv по модулю ie. Пример: х%= 10;

”= Использование: iv ”= ie Сдвиг двоичного представления iv вправо на ie бит. Пример: х”=4;

“== Использование: iv “= ie Сдвиг двоичного представления iv влево на ie бит. Пример: х “= 1;

<Ь= Использование: iv &= ie Побитовая операция И двоичных представлений iv и ie. Пример: remitems &= mask,

= Использование: iv "= ie Побитовая операция исключающее ИЛИ двоичных представлений iv и je. Пример: control "= seton;

1= Использование: iv 1= ie Побитовая операция ИЛИ двоичных представлений iv и ie. Пример: additems |= mask;

Логические операции

! Использование: !ае или !ре Истина, если ае или ре ложно. Пример: if (!good) prmtf ("not good"),

II Использование:el i, e2 Логическая операция ИЛИ значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, если значение el - Ложь. Значением выражения является Истина, если истинно значение е1 или e2. Пример: if (х < А || х > В)

printf ("out of range"),

&& Использование: el && e2 Логическая операция И значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, если значение el — Истина. Значением выражения является Истина, если значения е1 и e2 - Истина. Пример: if (р! = NULL && *р > 7) п++;

Если р - не нулевой указатель и значение переменной, на которую указывает р, больше, чем 7, то увеличить п на 1. Обратите внимание, что если значение указателя р равно NULL (0), то выражение *р не имеет смысла.

Побитовые операции

~ Использование: ie Дополнение до единицы значения ie. Значение выражения содержит 1 во всех разрядах, в которых ie содержит 0, и 0 во всех разрядах, в которых ie содержит 1. Пример: opposite = mask,

” Использование: iel ” ie2 Двоичное представление iel сдвигается вправо на ie2 разрядов. Сдвиг вправо может быть арифметическим (т. е. освобождающиеся слева разряды заполняются значением знакового разряда) или логическим в зависимости от реализации, однако гарантируется, что сдвиг вправо целых чисел без знака будет логическим и освобождающиеся слева разряды будут заполняться нулями. Пример: х= х” 3;

“ Использование: iel “ ie2 Двоичное представление iel сдвигается влево на ie2 разрядов; освобождающиеся справа разряды заполняются нулями. Пример: fourx= x“ 2;

& Использование: iel & ie2 Побитовая операция И двоичных представлений iel и ie2. Значение выражения содержит 1 во всех разрядах, в которых и iel и ie2 содержат 1, и 0 во всех остальных разрядах. Пример: flag = ((х & mask) != 0);

I Использование: iel | ie2 Побитовая операция ИЛИ двоичных представлений iel и ie2. Значение выражения содержит 1 во всех разрядах, в которых iel или ie2 содержит 1, и 0 во всех остальных разрядах. Пример: attrsum= attrl I attr2:

*> Использование: iel* ie2 Побитовая операция исключающее ИЛИ двоичных представлений iel и ie2. Значение выражения содержит 1 в тех разрядах, в которых iel и ie2 имеют разные двоичные значения, и 0 во всех остальных разрядах. Пример: diifbits= x'y;

Адресные операции

& Использование: &v Значением выражения является адрес переменной v. При мер i intptr = &n;

* Использование: *ре Значением выражения является переменная, адресуемая указателем ре. Пример: *ptr = с:

* Использование: *fpe Значением выражения является функция, адресуемая указателем fpe. Пример: fpe = funcname. (*fpe) (argl,arg2);

Операции над массивами

[ ] Использование: ре [ie] Значением выражения является переменная, отстоящая на ie переменных от адреса, заданного ре. Это значение эквивалентно значению выражения *(ре + ie). Пример: arname [i]= 3; Присвоить значение 3 i-му элементу массива arname. Обратите внимание, что первый элемент массива описывается выражением шпате [о].

Операции над структурами или объединениями

Использование: sv^mem Значением выражения является элемент smem структуры или объединения sv. Пример: product.p_revenue = 50; Присвоить значение 50 элементу p_revenue структурной переменной product.

-> Использование: spe —> smem Значением выражения является элемент smem структуры (или объединения), на которую (ое) указывает spe. Это значение эквивалентно значению выражения (*spe)^mem. Пример: prodptr -> р ^revenue = 2; Присвоить значение 2 элементу p_revenue структурной переменной, на которую указывает prodptr.

Другие операции

?: Использование: ае ? е1 : е2 или ре ? е1 : е2 Если истинно ае или ре, то выполняется е1; иначе выполняется е2. Значением этого выражения является значение выражения е1 или е2. Пример abs = (i <= 0) ' -i. i,

Использование: el, е2 Сначала выполняется выражение е1, потом выражение е2. Значением всего выражения является значение выражения е2. Пример for (i=A, J=B, i<i, i++, j—) p[i] =pdl

sizeof Использование: sizeof(e) Число байт, требуемых для размещения данных типа е. ' 'Если е описывает массив, то в этом случае е обозначает весь массив, а не только адрес первого элемента, как во всех остальных операциях. "^ sizeof Использование: sizeof(-nin) Число байт, требуемых для размещения объектов типа тип. Пример п = sizeof(arnaine) / sizeof(mt), Число элементов в массиве целых чисел, определяемое как число байт в массиве, поделенное на число байт, занимаемых одним элементом массива, (тип) Использование: (тип)е Значение е, преобразованное в тип данных тип. Пример х= (float)n/3, Целое значение переменной п преобразуется в число с плавающей точкой перед делением на 3.

( ) Использование: fe(el, е2,..., eN) Вызов функции fe с аргументами е1, е2,..., eN. Значением выражения является значение, возвращаемое функцией. Обратите внимание, что порядок выполнения выражений е1,..., eN не гарантируется (см. с 39) Пример х = sqrt(y),