Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Язык программирования Си (1985)

.pdf
Скачиваний:
1056
Добавлен:
15.06.2014
Размер:
558.87 Кб
Скачать

11

3.5. Строковые константы

Строковая константа представляется последовательностью символов кода ASCII, заключенной в кавычки: "... ".

П р и м е р ы

"This is a character string" "Это строковая константа" "А" "1234567890" "0" "$"

Строковая константа - это массив символов, заключенный в кавычки; она имеет тип char [ ].

В конце каждой строки компилятор помещает нулевой символ '\0', отмечающий конец данной строки.

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

Символ \ и следующий за ним символ новой строки игнорируются.

3.6. Перечислимые константы

Имена, указанные в описании перечислимых констант, трактуются как целые константы (см. с. 46).

3.7. Размер данных

Следующая таблица дает размер в битах основных типов данных для различных ЭВМ3. Адрес слова определяется по байту с нулевым номером.

Основные типы данных

3B Computer

DEC PDP-11

DEC VAX

 

Код ASCII

Код ASCII

Код ASCII

char

8

 

8

8

 

int

32

 

16

32

 

short

16

 

16

16

 

long

32

 

32

32

 

float

32

 

32

32

 

double

64

 

64

64

 

Диапазон float

±10±38

 

±10±38

±10±38

 

Диапазон double

±10±308

 

±10±38

±10±38

 

Порядок байт в слове

 

 

 

 

 

 

 

 

0 1 2 3

 

1 0 3 2

 

3 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 Аналогичные данные для советских ЭВМ, на которых работает компилятор языка Си, представлены в таблице на с.17. – Прим.перев.

12

Основные типы данных

HONEYWELL

IBM 360/370

INTERDATA

 

6000

 

Код EBCDIC

8/32

 

Код ASCII

 

 

 

Код ASCII

char

9

 

8

 

8

int

36

 

32

 

32

short

36

 

16

 

16

long

36

 

32

 

32

float

36

 

32

 

32

double

72

 

64

 

64

Диапазон float

±10±38

 

±10±76

 

±10±76

Диапазон double

±10±308

 

±10±76

 

±10±76

Порядок байт в слове

 

 

 

 

 

 

 

 

0 1 2 3

 

 

0 1 2 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

З а м е ч а н и е. Следующая таблица представляет предварительные данные. Отдельные позиции (обозначенные **) могут быть изменены.

Основные типы данных

char int short long float double

Диапазон float Диапазон double Порядок байт в слове

MOTOROLA 68000 Код ASCII

 

 

 

NSC 16000 Код ASCII

 

 

 

ZILOG 8000

Код ASCII

INTEL 80286 Код ASCII

 

 

 

8

 

 

8

 

 

8

 

 

 

8

 

32**

 

32

 

 

16**

 

 

16

 

16

 

 

16

 

 

16

 

 

 

16

 

32

 

 

32

 

 

32

 

32**

 

32

 

 

32

 

 

32

 

 

 

32

 

32

 

 

64

 

 

64**

 

 

64

 

±10±38

 

 

±10±38

 

 

±10±38

 

±10±38

 

±10±308

 

 

±10±308

 

 

±10±308

 

±10±308

 

 

0 1 2 3

 

 

 

3 2 1 0

 

 

 

0 1

 

2 3

 

 

3 2

 

1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Основные типы данных

СМ4, СМ 1420

ЕС ЭВМ

СМ 1700

 

Код КОИ-8

ДКОИ

КОИ-8

char

8

8

 

8

 

int

16

32

 

32

 

short

16

16

 

16

 

long

32

32

 

32

 

float

32

32

 

32

 

double

64

64

 

64

 

Диапазон float

±10±38

±10±76

 

±10±38

 

Диапазон double

±10±38

±10±76

 

±10±38

 

Порядок байт в слове

 

 

 

 

 

 

 

1 0 3 2

 

0 1 2 3

 

 

3 2 1 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13

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

4.1. Выражения

Выражение состоит из одного или большего числа операндов и символов операций.

П р и м е р ы

а++ b=10 х=(y*z)/w

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

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

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

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

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

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

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

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

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

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

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

f- функция;

fp - указатель на функцию.

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

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

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

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

Сумма значений ael и ае2.

П р и м е р

i = j + 2;

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

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

Адрес переменной типа ре, больший на ie адреса, заданного указателем ре.

П р и м е р

last = arname + arsize – 1;

Присваивает переменной last адрес последнего элемента массива arname.

-Использование: ael - ае2

Разность значений ael и ае2.

14

Пр и м е р

i = j - 3;

-Использование: ре - ie

Адрес переменной типа ре, меньший на ie адреса, заданного указателем ре.

Пр и м е р

first = last - arsize + 1;

-Использование: pel - ре2

Число переменных типа ре в диапазоне от ре2 до pel.

П р и м е р

arsize = last – first;

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

Изменение знака ае.

Пр и м е р

x = —x;

*Использование: ael * ае2

Произведение значений ael и ае2.

П р и м е р

z = 3 * х;

/Использование: ael / ае2.

Частное от деления ael на ае2.

Пр и м е р

i = j / 5;

%Использование: ael % ае2

Остаток от деления (деление по модулю) ael на ае2.

П р и м е р

minutes = time % 60;

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

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

Увеличение iv на 1 Значением этого выражения является значение iv до увеличения.

П р и м е р

j = i++;

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

Увеличение указателя pv на 1, так что он будет указывать на следующий объект того же типа. Значением этого выражения является значение pv до увеличения.

15

П р и м е р

*ptr++ = 0;

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

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

Увеличение iv на 1. Значением этого выражения является значение iv после увеличения.

Пр и м е р

i = ++j;

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

Увеличение pv на 1. Значением этого выражения является значение pv после увеличения.

Пр и м е р

*++ptr = 0;

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

Уменьшение iv на 1. Значением этого выражения является значение iv до уменьшения.

П р и м е р

j = i--;

--Использование: pv--

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

П р и м е р

arrpos = р--;

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

Уменьшение iv на 1. Значением этого выражения является значение iv после уменьшения.

Пр и м е р

i = --j;

--Использование: --pv

Уменьшение pv на 1. Значением этого выражения является значение pv после уменьшения.

Пр и м е р

prepos = --р;

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

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

=Использование: v = e

16

Присваивание значения е переменной v.

Пр и м е р

х= у;

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

+= Использование: av += ae

Увеличение av на ae

Пр и м е р

у+= 2;

Увеличение переменной у на 2.

+= Использование: pv += ie

Увеличение pv на ie.

Пр и м е р

р+= n;

-= Использование: 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

17

Сдвиг двоичного представления iv вправо на ie бит.

П р и м е р

х >>= 4;

<<= Использование: iv <<= ie

Сдвиг двоичного представления iv влево на ie бит.

Пр и м е р

х<<= 1;

&= Использование: iv &= ie

Побитовая операция И двоичных представлений iv и ie.

П р и м е р

remitems &= mask;

^= Использование: iv ^= ie

Побитовая операция исключающее ИЛИ двоичных представлений iv и ie.

П р и м е р

control ^= seton;

|= Использование: iv |= ie

Побитовая операция ИЛИ двоичных представлений iv и ie.

П р и м е р

additems |= mask;

4.5. Операции отношения

З а м е ч а н и е. Логическое значение Ложь представляется целым нулевым значением, а значение Истина представляется любым ненулевым значением.

Значением выражений, содержащих операции отношения или логические операции, является 0 (Ложь) или 1 (Истина).

==Использование: ie1 == ie2

Истина, если ie1 равно ie2; иначе - Ложь.

П р и м е р

if (i == 0) break;

==Использование: pe1 == pe2

Истина, если значения указателей pe1 и pe2 равны.

!= Использование: ie1 != ie2

Истина, если ie1 не равно ie2

П р и м е р

while (i != 0) i = func;

18

!= Использование: pe1 != pe2

Истина, если значения указателей pe1 и pe2 не равны.

П р и м е р

if (p != q) break;

<Использование: ae1 < ae2

Истина, если ae1 меньше, чем ae2.

П р и м е р

if (x < 0) printf("negative");

<Использование: pe1 < pe2

Истина, если значение pe1 (т.е. некоторый адрес) меньше, чем значение pe2.

П р и м е р

while (p < q) *p++ = 0;

Пока адрес, заданный p, меньше, чем адрес, заданный q, присваивать значение 0 переменной, на которую указывает p, и увеличивать значение p так, чтобы этот указатель указывал на следующую переменную.

<= Использование: ae1 <= ae2

Истина, если ae1 меньше или равно ae2.

<= Использование: pe1 <= pe2

Истина, если pe1 меньше или равно pe2.

>Использование: ae1 > ae2

Истина, если ae1 больше, чем ae2.

П р и м е р

if (x > 0) printf("positive");

>Использование: pe1 > pe2

Истина, если значение pe1 (т.е. некоторый адрес) больше, чем значение pe2.

П р и м е р

while (p > q) *p-- = 0;

>= Использование: ae1 >= ae2

Истина, если ae1 больше или равно ae2.

>= Использование: pe1 >= pe2

Истина, если pe1 больше или равно pe2.

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

!Использование: !ае или !ре

Истина, если ае или ре ложно.

19

П р и м е р

if (!good)

printf ("not good");

||Использование: el || e2

Логическая операция ИЛИ значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, если значение el - Ложь. Значением выражения является Истина, если истинно значение е1 или e2.

П р и м е р

if (х < А || х > В)

printf ("out of range");

&&Использование: el && e2

Логическая операция И значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, если значение e1 — Истина. Значением выражения является Истина, если значения е1 и e2 - Истина.

П р и м е р

if (р ! = NULL && *р > 7) n++;

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

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

~ Использование: ~ie

Дополнение до единицы значения ie. Значение выражения содержит 1 во всех разрядах, в которых ie содержит 0, и 0 во всех разрядах, в которых ie содержит 1.

П р и м е р

opposite = ~mask;

>>Использование: iel >> ie2

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

Пр и м е р

x = х >> 3;

<<Использование: iel << ie2

Двоичное представление iel сдвигается влево на ie2 разрядов; освобождающиеся справа разряды заполняются нулями.

П р и м е р

fourx = x << 2;

&Использование: iel & ie2

20

Побитовая операция И двоичных представлений iel и ie2. Значение выражения содержит 1 во всех разрядах, в которых и iel и ie2 содержат 1, и 0 во всех остальных разрядах.

П р и м е р

flag = ((х & mask) != 0);

|Использование: iel | ie2

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

П р и м е р

attrsum = attrl | attr2;

^Использование: iel ^ ie2

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

П р и м е р

diffbits = x ^ y;

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

&Использование: &v

Значением выражения является адрес переменной v.

П р и м е р

intptr = &n;

*Использование: *ре

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

П р и м е р

*ptr = с;

*Использование: *fpe

Значением выражения является функция, адресуемая указателем fpe.

П р и м е р

fpe = funcname; (*fpe) (argl,arg2);

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

[ ] Использование: ре [ie]

Значением выражения является переменная, отстоящая на ie переменных от адреса, заданного ре. Это значение эквивалентно значению выражения *(ре + ie).

П р и м е р

arname [i]= 3;