Язык программирования Си для персонального компьютера
Шрифт:
int a;
inl b;
struct pair *sp;
} item, list[10];
item.sp = &item; /* пример 1 */
(item.sp)->a = 24; /* пример 2 */
list[8].b = 12; /* пример 3 */
В первом примере адрес структуры Нет присваивается элементу sp этой же структуры. В результате структура item содержит указатель на себя.
Во втором примере используется адресное выражение item.sp с операцией выбора элемента ->, присваивающее значение элементу а. Учитывая результат примера 1,
item.a = 24;
В третьем примере показано, каким образом в массиве структур осуществить доступ к элементу отдельной структуры.
Операции и 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.7.2. Абстрактные имена типов описаны в разделе 3.8.3.
Операнды некоторых операций в языке Си должны представлять собой так называемые L-выражения (Lvalue expressions). L-выражением является выражение, которое ссылается на ячейку памяти и потому имеет смысл в левой части бинарной операции присваивания. Простейшим примером L-выражения является идентификатор переменной: он ссылается на ячейку памяти, которая хранит значение этой переменной.
Поскольку L-выражение ссылается на ячейку памяти, адрес этой ячейки может быть получен с помощью операции адресации (&). Имеются, однако, исключения: не может быть получен адрес битового поля и адрес переменной класса памяти register, хотя значение им может быть присвоено.
К L-выражениям относятся:
— идентификаторы переменных целого, плавающего, перечислимого типов, указателей, структур и объединений;
— индексные выражения, исключая те из них, значение которых имеет тип массив;
— выражение выбора элемента, если выбранный элемент сам является одним из допустимых L-выражений;
— выражение косвенной адресации, если только его значение не имеет тип массив или функция;
— L-выражение в скобках;
— выражение приведения типа переменной, если размер результирующего типа не превышает размера первоначального типа. Следующий пример иллюстрирует этот случай:
char *р;
int i;
long n;
(long *)p = &n; /* допустимое приведение типа */
(long)i = n; /* недопустимое приведение типа */
Перечисленные L-выражения называются также модифицируемыми L-выражениями. Кроме того, существуют немодифицируемые L-выражения; их адрес может быть получен, но использоваться в левой части бинарной операции присваивания они не могут. К ним относятся идентификаторы массивов, функций, а также переменных, объявленных с модификатором const.
Скобочные выражения
Любой операнд может быть заключен в круглые скобки. В выражении
(10+5)/5
скобки означают, что выражение 10+5 является левым операндом операции деления. Результат выражения равен 3. В отсутствие скобок значение выражения равнялось бы 11. Хотя скобки влияют на то, каким путем группируются операнды в выражении, они не гарантируют определенный порядок вычисления операндов для операций, обладающих свойством коммутативности (мультипликативные, аддитивные, поразрядные операции). Например, выражение (а+b)+с компилятор может вычислить как а+(b+с) или даже как (а+с)+b.