НазадОглавлениеДалее

4.2.7. Операции и L-выражения

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

Первичные выражения рассмотрены в разделах 4.2.4, 4.2.5, 4.2.6.

Унарное выражение состоит из операнда с предшествующей ему унарной операцией.

Синтаксис:
<унарная-операция><операнд>

Унарные операции рассмотрены в разделе 4.3.2.

Бинарное выражение состоит из двух операндов, разделенных бинарной операцией.

Синтаксис:
<операнд1><бинарная-операция><операнд2>

Бинарные операции рассмотрены в разделах 4.3.3 - 4.3.9.

Тернарное выражение состоит из трех операндов, разделенных знаками условной операции "?:".

Синтаксис:
<операнд1>?<операнд2>:<операнд3>

Условная операция рассмотрена в разделе 4.3.10.

Выражения присваивания используют унарные или бинарные операции присваивания. Унарными операциями присваивания являются инкремент "++" и декремент "--". Бинарные операции присваивания - это простое присваивание "=" и составные операции присваивания. Каждая составная операция присваивания представляет собой комбинацию какой-либо бинарной операции с простой операцией присваивания.

Синтаксис выражений присваивания:

Унарные операции присваивания:
<операнд>++
<операнд>--
++<операнд>
--<операнд>

Бинарные операции присваивания:
<операнд1>=<операнд2>
<операнд1><составное-присваивание><операнд2>

Операция присваивания рассмотрена в разделе 4.4.

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

Синтаксис:
(<абстрактное-имя-типа>)<операнд>

Операция приведения типа подробно рассматривается в разделе 4.7.2. Абстрактные имена типов описаны в разделе 3.8.3.

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

Поскольку L-выражение ссылается на ячейку памяти, адрес этой ячейки может быть получен с помощью операции адресации (&). Имеются, однако, исключения: не может быть получен адрес битового поля и адрес переменной класса памяти register, хотя значение им может быть присвоено.

К L-выражениям относятся:
- идентификаторы переменных целого, плавающего, перечислимого типов, указателей, структур и объединений;
- индексные выражения, исключая те из них, значение которых имеет тип массив;
- выражение выбора элемента, если выбранный элемент сам является одним из допустимых L-выражений;
- выражение косвенной адресации, если только его значение не имеет тип массив или функция;
- L-выражение в скобках;
- выражение приведения типа переменной, если размер результирующего типа не превышает размера первоначального типа. Следующий пример иллюстрирует этот случай:
char *p;
int i;
long n;
(long *)p=&n; /*допустимое приведение типа*/
(long)i=n; /*недопустимое приведение типа*/

Перечисленные L-выражения называются также модифицируемыми L-выражениями. Кроме того, существуют немодифицируемые L-выражения; их адрес может быть получен, но использоваться в левой части бинарной операции присваивания они не могут, К ним относятся идентификаторы массивов, функций, а также переменных, объявленных с модификатором const.


НазадОглавлениеДалее