Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабник по C.pdf
Скачиваний:
74
Добавлен:
01.06.2015
Размер:
876.9 Кб
Скачать

10 –

Вобъединение table типа trans включены три элемента различных типов. В обычной

структуре под эти элементы выделяется три поля. Здесь отводится одно, причем его размер определятся максимальным размером элемента из заданного списка. Это значит, что под переменную table отводится 8 байтов. В разных местах программы в table можно записывать данные, описанные в объединении типов char, int, double.

Например: table.n1=35; или gets(table.str);

2.12. ПЕРЕЧИСЛЕНИЕ

Перечисление объявляется следующим образом

enum имя_пречислимого_типа{ список констант } имя_переменной;

Например,

enum color{ red, green,yellow } suite[3];

Константам автоматически присваиваются возрастающие целые значения в порядке слева направо. Значения константам, причем произвольные, можно присвоить и при объявлении.

2.13. БИТОВОЕ ПОЛЕ ( ЗАПИСЬ )

Поле – последовательность двоичных разрядов, целого или целого беззнакового типа. Поле объявляется как структура, в которой каждая составляющая именуется с указанием ее длины в битах. Например:

struct { unsigned n1:2; unsigned n2:6; unsigned n3:3; } MyPole;

Здесь задаются три поля: на два, шесть и три разряда соответственно.

Битовые поля располагаются в памяти от меньших полей к большим. Память выделяется

так:

 

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

имя поля

 

 

 

 

n3

 

 

n2

 

 

 

 

 

n1

 

Операции присваивания над полями выполняются следующим образом:

MyPole.n1=1;

MyPole.n2=7;

MyPole.n3=3;

После выполнения этих операций значения полей в памяти будут такими:

бит

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

значение

0

1

1

0

0

0

1

1

1

0

1

Над полями можно выполнять операции над битами: &, ^, |.

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

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

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

v – любое выражение, ссылающееся на переменную, которой может быть присвоено

значение (такое выражение называют адресным (L-value) выражением).

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

© 1998 Калачев Д.П., Лутай В.Н.

– 11 –

i – целое или символ;

a – арифметическое, т.е. целое, символ или вещественное;

p – указатель;

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

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

f – функция;

pf – указатель на функцию;

smem – имя поля структуры или объединения.

3.1.АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

ae1 + ae2 – сложение, результат – сумма двух значений;

pe + ie – результат – указатель, отстоящий от pe на ie объектов, того же типа что и pe. Например: aptr = array + 5, если array – это массив, а aptr – указатель того же типа, то aptr будет указывать на пятый элемент массива. Обратите внимание – к указателю добавляется не ie байт, а ie*sizeof(тип pe);

ae1 – ae2 – вычитание, результат – разность двух значений;

pe – ie – результат – указатель, отстоящий влево (в сторону уменьшения адресов) от pe на ie объектов, того же типа что и pe. Например: aptr = aptr – 1, aptr после операции будет указывать на элемент, предшествующий в памяти тому, на который указывал до операции;

pe1 – pe2 – вычитание указателей, результат – количество переменных того же типа, что и pe, в диапазоне от pe1 до pe2;

–ae – изменение знака выражения;

ae1 * ae2 – произведение;

ae1 / ae2 – частное от деления, если операнды целого типа, то деление с отбрасыванием остатка;

ie1 % ie2 – остаток от деления ie1 на ie2.

3.2.ОПЕРАЦИИ СРАВНЕНИЯ

Операндами операций сравнения могут быть любые арифметические или адресные вы-

ражения. Результатом операций сравнения всегда является целое выражение со значением 0, обозначающим ЛОЖЬ, и – 1, обозначающим ИСТИНУ.

e1 == e2 – равно; результат равен 1, если значения операндов равны, в противном случае результат равен 0;

e1 != e2 – не равно; результат равен 1, если значения операндов не равны, в противном случае результат равен 0;

e1 < e2 – меньше; результат равен 1, если значение первого операнда меньше значения второго, в противном случае результат равен 0;

e1 > e2 – больше; результат равен 1, если значение первого операнда больше значения второго, в противном случае результат равен 0;

e1 <= e2 – меньше или равно; результат равен 1, если значение первого операнда меньше или равно значению второго, в противном случае результат равен 0;

e1 >= e2 – больше или равно; результат равен 1, если значение первого операнда

больше или равно значению второго, в противном случае результат равен 0.

Следует обратить внимание, что правильность выполнения операций сравнения на больше/меньше для указателей не гарантируются.

© 1998 Калачев Д.П., Лутай В.Н.

– 12 –

3.3. ЛОГИЧЕСКИЕ ОПЕРАЦИИ

Операндами логических операций могут быть любые арифметические или адресные выражения; операнд считается ЛОЖЬЮ, если он содержит нулевое значение, и ИСТИНОЙ в противном случае. Результатом логических операций всегда является целое выражение со значением 0, обозначающим ЛОЖЬ, и – 1, обозначающим ИСТИНУ.

!e – инверсия (НЕ), т.е. не нулевое значение даст в результате 0, а нулевое – 1; например: если aa=5, то !aa будет равно 0;

ae1 || ae2 – дизъюнкция или логическое сложение (ИЛИ); например: если aa=5, bb=0, cc=2, то результат aa||bb равен 1, а результат aa||cc – 1;

ae1 && ae2 – конъюнкция или логическое умножение (И); например: если aa=5,

bb=0, cc=2, то результат aa&&bb равен 0, а результат aa&&cc – 1;

При логических вычислениях применяется т.н. сокращенная схема, т.е. если первый операнд определяет результат, то второй не вычисляется. Например: выражение ch!='\t' && ch!='\n' && ch!='\0' состоит из 3-х логических операций (ИСТИНА, если ch не символ табуляции и не символ перевода строки и не символ конца строки); если первая возвращает ЛОЖЬ, то остальные не проверяются.

3.4.ПОБИТОВЫЕ (ПОРАЗРЯДНЫЕ) ОПЕРАЦИИ

~ie – инверсия или дополнение до единицы (НЕ); значение каждого разряда изменяется с 0 на 1, или с 1 на 0. Например: пусть aa=5 и aa типа unsigned short( 5 в двоичной системе – 101); результат ~aa равен 1111111111111010 или 65530;

ie1 | ie2 – дизъюнкция или логическое сложение над каждой парой разрядов операндов (ИЛИ); например, если aa=5, bb=0, cc=2, то результат aa|bb будет равен 0 и результат aa|ccb будет – 7, т.к. двоичные представления aa=101, bb=0, cc=10;

ie1 & ie2 – конъюнкция или логическое умножение над каждой парой разрядов операндов (И); например, если aa=13, bb=0, cc=7, то результат aa&bb будет равен 0 и результат aa&cc будет – 5, т.к. двоичные представления aa=1101, bb=0, cc=111;

ie1 ^ ie2 – сумма по модулю два (исключающее или) над каждой парой разрядов операндов; например, если aa=5, bb=0, cc=3, то результат aa^bb будет равен 5 и результат aa^cc будет – 6, т.к. двоичные представления aa=101, bb=0, cc=11;

ie1 << ie2 и ie1 >> ie2 – сдвиг первого операнда на число двоичных разрядов, заданных вторым операндом; при сдвиге влево разряды теряются, при сдвиге вправо – заменяются знаковым разрядом, если первый операнд знаковое целое, или нулем, ес-

ли беззнаковое. Например, пусть unsigned short aa=0FF01x и unsigned short bb=FF01x, тогда результат aa<<2 и bb<<2 будет – FC04x а, aa>>2 будет – 3FC0x, bb>2 будет – FFC0x.

3.5.ОПЕРАЦИИ ПРИСВАИВАНИЯ

v= e – в языке Си символ = обозначает не оператор, а операцию присваивания. Это значит, что выражение a=b имеет значение, и это значение равно значению правой части операции присваивания, т.е. в данном случае значению b.

Например:

a = b + ( c=d ); в соответствии с приоритетами операций, вначале вычисляется c=d, потом результат присваивания прибавляется к b, и, наконец , a получает значение этой суммы;

if(( ch = getchar()) == 'A' ) { ... }; ch получает значение, возвращаемое

функцией getchar и это значение сравнивается с символом 'A'.

Коперациям присваивания также относят следующие:

av += ae – добавить ae к av, это эквивалентно выражению av = av + ae;

av –= ae – уменьшить ae на av, это эквивалентно выражению av = av - ae;

© 1998 Калачев Д.П., Лутай В.Н.

– 13 –

av *= ae – умножить ae на av, это эквивалентно выражению av = av * ae;

av /= ae – разделить ae на av, это эквивалентно выражению av = av / ae;

av %= ae – взять остаток от деления ae на av, это эквивалентно выражению av = av % ae;

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

iv++ или ++iv – постфиксная и префиксная операция увеличения на единицу (ин-

кремента) значения переменной. С точки зрения результата эти операции эквивалентны iv = iv + 1, однако разница проявляется в использовании значения выражения в целом. Например: int m[5]={1,2,3,4,5}, i = 2, j = 2, a, b; a = m[i++]; b = m[++j];

значения переменных будут следующими: a=3, b=4, i=3, j=3. Это объясняется тем, что значением выражения i++ является значение переменной i до выполнения инкремента, а значением выражения ++i является значение переменной i после выполнения инкремента;

iv–– или ––iv – постфиксная и префиксная операция уменьшения на единицу (декремента) значения переменной;

pv++ или ++pv – постфиксная и префиксная операция увеличения на единицу значения указателя. Обратить внимание не на один байт, а на один элемент соответствующего типа;

pv–– или ––pv – постфиксная и префиксная операция уменьшения на единицу значения указателя.

3.6.АДРЕСНЫЕ ОПЕРАЦИИ

&v – значением выражения будет адрес переменной v;

*pe – значением выражения будет переменная, адресуемая указателем pe;

pe[ie] – значением выражения будет переменная (элемент массива), отстоящая на ie элементов от адреса, заданного pe. Это значение эквивалентно значению выраже-

ния *(pe+ie). Например:

int m[5]={1,2,3,4,5}, *pi, a, b ,c;

pi = &m[3]; // pi будет содержать адрес элемента m[3] a = *(pi+1); // a будет равно 5

b = m[4];

// b будет равно 5

c = *(m+2);

// c будет равно 3

*fpe – значением выражения будет функция, адресуемая указателем fpe. Например: fpe=&strcmp; i=(*fpe)(s1,s2);

3.7.ДОСТУП К ПОЛЯМ СТРУКТУР, ОБЪЕДИНЕНИЙ И ЗАПИСЕЙ

sv.smem – значением выражения будет элемент smem структуры (объединения) sv, тип

выражения будет соответствовать типу элемента;

spe->smem – значением выражения будет элемент smem структуры (объединения), на которую указывает spe.

3.8.ДРУГИЕ ОПЕРАЦИИ

ae ? e1 : e2 – условное выражение, значением выражения будет e1, если выражение ae ИСТИННО (в смысле подраздела «Логические операции»), и – e2, если выраже-

ние ae ЛОЖНО; Например:

abs = c < 0 ? –c : c; // вычисление модуля числа c

max = a > b ? a : b; // вычисление максимума двух чисел

e1, e2 – операция запятая, значением выражения будет e2. Назначение этой операции – обеспечить возможность использования нескольких выражений, в тех местах,

©1998 Калачев Д.П., Лутай В.Н.