Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
03.03.2016
Размер:
2.4 Mб
Скачать

1. Алфавит языка Си

  1. Буквенные символы

  2. Цифры

  3. Знаки математических операций

  4. Знаки сравнения

  5. Скобки

  6. Разделители

  7. Управляющие символы

  8. Специальные символы

(A..Z, a..z );

(0..9);

* / + -

< > =

( ) [ ] { }

. , ; : “ ‘ ...

CR, LF, ...

? – условный оператор

! – логическое отрицание

| – побитовое логическое ИЛИ

& – амперсанд, побитовое логическое И

^ – побитовое исключающее ИЛИ

~ – тильда, побитовое отрицание

\ – обратный слэш

# – знак номера

пробельный символ

символ табуляции ...

2. Элементы языка

  1. символы -

  2. слова -

  3. выражения -

  4. предложения -

Алфавит

лексемы

арифметические, логические, выражения цикла

инструкции

2.1 Лексема - единица текста программы, рассматриваемая транслятором как единое целое.

Программа - строка лексем, которые отделяются друг от друга другими лексемами или разделителями.

Лексемы делятся на

  • идентификаторы

  • операции

  • зарезервированные слова

  • комментарии

  • константы

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

  1. Они должны начинаться с буквы латинского алфавита (а,...,z, А,...,Z) или с символа подчеркивания ( _ ).

  2. В них могут использоваться буквы латинского алфавита, символ подчеркивания и цифры (0,...,9). Использование других символов в идентификаторах запрещено.

  3. В языке Си буквы нижнего регистра (а,...,z), применяемые в идентификаторах, отличаются от букв верхнего регистра (А,...,Z). Это означает, что следующие идентификаторы считаются разными: name, NaMe, NAME и т.д.

  4. Идентификаторы могут иметь любую длину, но воспринимается и используется для различения объектов (функций, переменных, констант и т.д.) только часть символов. Их число меняется для разных систем программирования, но в соответствии со стандартом ANSI Си не превышает 32 (в С++ это ограничение снято). Например, если длина идентификатора установлена равной 5, то имена count и counter будут идентичны, поскольку у них совпадают первые пять символов.

  5. Идентификаторы для новых объектов не должны совпадать с зарезервированными (ключевыми) словами языка и именами стандартных функций из библиотеки.

Операции

Операция — это некоторая функция, которая выполняется над операндами и которая возвращает вычисленное значение — результат выполнения операции. Каждой операции в Си соответствует свой знак операции. Операции классифицируются по нескольким признакам.

Операции различают по количеству задействованных операндов (операнд — это константа, переменная, выражение или вызов какой-либо определённой в программе функции), а именно — различают

унарные операции — операции вида [знак операции] [операнд],

бинарные операции [операнд] [знак операции] [операнд],

и тернарные операции.

Унарные операции — это операции, содержащие единственный операнд.

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

+(унарный плюс), - (унарный минус), ~ (побитовое отрицание), ! (логическое отрицание), & (взятие адреса), * (операция разыменовывания указателя), sizeof (операция определения занимаемого объектом объёма памяти).

Бинарные операции — это операции, содержащие два операнда, между которыми расположен знак операции.

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

+ (сложение), - (вычитание), * (умножение), / (деление), % (взятие остатка от деления), & (поразрядное И), | (поразрядное ИЛИ), ^ (поразрядное исключающее ИЛИ), && (логическое И), || (логическое ИЛИ).

Также к бинарным операциям в Си относятся операции, по сути представляющие собою присваивание:

+= (добавление к левому операнду значения, представленного правым операндом)

-= (вычитание из левого операнда значения, представленного правым операндом)

*= (умножение левого операнда на значение, представленное правым операндом)

/= (деление левого операнда на значение, представленное правым операндом)

В Си имеется единственная тернарная операция — условная операция, которая имеет следующий вид:

[условие] ? [выражение1] : [выражение2];

и которая имеет три операнда:

  • [условие] — логическое условие, которое проверяется на истинность,

  • [выражение1] — выражение, значение которое возвращается в качестве результата выполнения операции, если условие истинно;

  • [выражение2] — выражение, значение которое возвращается в качестве результата выполнения операции, если условие ложно.

Знаком операции здесь служит сочетание ? :

По функциональному назначению операции делятся на:

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

  2. Логические операции и операции отношения.

  3. Операции с битами.

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

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

Арифметические операции задаются следующими символами:

Символ операции

Значение

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

*

Умножение

expr1 * expr2

/

Деление

expr1 / expr2

%

Остаток от деления

expr1 % expr2

+

Сложение

expr1 + expr2

-

Вычитание

expr1 – expr2

++

Инкремент

++expr или expr++

--

Декремент

--expr или expr--

где expr – операнд.

Остаток от деления нельзя применять к операндам вещественного типа.

Операции инкремента или увеличения (++) и декремента, т.е. уменьшения (--) дают возможность компактной записи для изменения значения целочисленной переменной на единицу.

Выражение n++ является постфиксной формой инкремента. Значение переменной n увеличивается после того, как ее текущее значение употреблено в арифметическом выражении. Аналогично, выражение m-- является постфиксной формой оператора декремента.

Существует и префиксная форма этих операторов: ++n, --m. При использовании такой формы текущее значение переменной сначала увеличивается или уменьшается и только потом используется в арифметическом выражении.

Например, если n равно 5, то выражение ++n + 3 будет равно 9, а n++ + 3 будет равно 8. В обоих случаях после использовании в выражении значение n будет равно 6.

Операции отношения и логические операции

Логические операции отношения традиционно должны давать одно из двух значений: истину или ложь. В языке Си принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного.

Символ операции

Значение

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

!

Логическое НЕ

!expr

<

Меньше

expr1 < expr2

<=

Меньше или равно

expr1 <= expr2

>

Больше

expr1 > expr2

>=

Больше или равно

expr1 >= expr2

==

Равно

expr1 == expr2

!=

Не равно

expr1 != expr2

&&

Логическое И

expr1 && expr2

||

Логическое ИЛИ

expr1 || expr2

Операции с битами можно применять к операндам целого типа. Их нельзя применять к операндам вещественных или более сложных типов.

Символ операции

Значение

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

~

поразрядное отрицание

~ expr

&

поразрядное "И"

expr1 & expr2

|

поразрядное "ИЛИ"

expr1 | expr2

^

поразрядное исключающее "ИЛИ"

expr1 ^ expr2

<<

сдвиг влево

expr1 << expr2

>>

сдвиг вправо

expr1 >> expr2

В операциях сдвига expr2 задается целым числом, определяющим количество бит на которые производится сдвиг.

Например, expr1 = 0000 1111.

Результатом выполнения операции expr1 << 1 будет значение 0001 1110.

Результатом выполнения операции expr1 >> 2 будет значение 0000 0011.

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

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

В результате операции присваивания (=) переменная получает новое значение. Она используется в операторе присваивания:

идентификатор = выражение;

Операция присваивания может присутствовать в любом выражении языка.

Например, в результате выполнения

c=(a=2)+(b=3) переменная а получит значение 2, b – 3, а с – 5;

i = j = 0 - присваивание 0 обеим переменным.

Операция “запятая”

Одно выражение может состоять из набора выражений, разделенных запятыми; например,

d=(b=a+1),c=a+2;

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

z = (х = у, у = 15);

определяет следующие действия: значение переменной у присваивается переменной х; переменной у присваивается значение 15; z получает значение переменной у. Скобки здесь необходимы, поскольку операция запятая имеет более низкий приоритет, чем операция присваивания, записанная после переменной z.

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

Символы операций могут состоять из 1-го (- +, -, ~., & …), 2-х (==, !=, <=, +=, && …) или 3-х символов (<<=, >>=).

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

Лексемы

Операция

Класс

Приоритет

Ассоциативность

имена, литералы

простые лексемы

первичный

16

нет

a[k]

индексы

постфиксный

16

слева направо

f(…)

вызов функции

постфиксный

16

слева направо

.

прямой выбор

постфиксный

16

слева направо

->

опосредованный выбор

постфиксный

16

слева направо

(имя типа) {init}

составной литерал (C99)

постфиксный

15

справа налево

++ --

положительное и отрицательное приращение

постфиксный

15

справа налево

sizeof

размер

унарный

15

справа налево

~

побитовое НЕ

унарный

15

справа налево

!

логическое НЕ

унарный

15

справа налево

- +

изменение знака, плюс

унарный

15

справа налево

&

адрес

унарный

15

справа налево

*

опосредование (разыменование)

унарный

15

справа налево

(имя типа)

приведение типа

унарный

15

справа налево

* / %

мультипликативные операции

бинарный

13

слева направо

+ -

аддитивные операции

бинарный

12

слева направо

<< >>

сдвиг влево и вправо

бинарный

11

слева направо

< > <= >=

отношения

бинарный

10

слева направо

== !=

равенство/неравенство

бинарный

9

слева направо

&

побитовое И

бинарный

8

слева направо

^

побитовое исключающее ИЛИ

бинарный

7

слева направо

|

побитовое ИЛИ

бинарный

6

слева направо

&&

логическое И

бинарный

5

слева направо

||

логическое ИЛИ

бинарный

4

слева направо

? :

условие

тернарный

3

справа налево

= += -= *= /= %= <<= >>= &= ^= |=

присваивание

бинарный

2

справа налево

,

последовательное вычисление

бинарный

1

слева направо

При вычислении выражения первыми выполняются операции с большим приоритетом. На порядок выполнения операций с одинаковым приоритетом указывает ассоциативность операций.

Зарезервированные слова

Зарезервированные слова — это лексемы, которые зарезервированы компилятором для обозначения типов переменных, класса хранения, элементов операторов

Стандартом С89 предусмотрены следующие зарезервированные слова:

  • для указания операции получения размера объекта: sizeof

  • для описания прототипа объекта: typedef

  • для объявления переменных:

для обозначения класса хранения переменных: auto, register

для обозначения того, что объект описывается в другом месте extern

для обозначения того, что объект статический static

  • для обозначения типа переменных char, short, int, long, signed, unsigned, float, double, void (для указания на произвольный родовой тип)

  • для обозначения специальных типов данных:

struct (структура), enum (перечисление), union (объединение)

  • для обозначения операторов и их элементов:

для обозначения операторов цикла: do, for, while

для обозначения условного оператора: if, else

для обозначения оператора выбора: switch, case, default

  • для обозначения операторов перехода:

операторы прерывания исполнения кода: break, continue

для обозначения оператора безусловного перехода: goto

  • для обозначения оператора возврата из функции: return.

В стандарте C99 были добавлены следующие ключевые слова:

  • для обозначения того, что функция является встраиваемой: inline

  • для обозначения типа переменной: _Bool, _Complex, _Imaginary

  • и для обозначения того, что restrict (поддержка ограниченных указателей).

Комментарии

В программах на языке Си важная роль отводится комментариям. Они повышают наглядность и удобство чтения программ. Комментарии обрамляются символами /* и */. Их можно записывать в любом месте программы. При этом оказывается невозможным вложить один комментарий в другой, поскольку первый встреченный символ */ завершит комментарий, и текст, следующий непосредственно за символом */, если этот текст не является программным кодом и содержит произвольный текст, вызовет ошибку компиляции.

/* Это многострочный комментарий.

Текст записывается на нескольких строках

до признака окончания комментария */

В языке С++ введена еще одна форма записи комментариев. Все, что находится после знака // до конца текущей строки, будет также рассматриваться как комментарий.

int a; //ширина прямоугольника

int b; //длина прямоугольника

int s; //площадь прямоугольника

Константы

Числовые константы

  • вещественные например 123.456, -3., .5 – формат с фиксированной запятой (десятичная точки и может быть целая часть и (или) дробная часть), 5.61е-4, -.6е10 - экспоненциальная форма. Они могут снабжаться суффиксом F (или f), например 123.456F, 5.61e-4f. Диапазон вещественных констант 2,3·10−308 . . . 1,7×10+308;

  • целые десятичные (4 байта), например 125, -3276. Диапазон целых констант (определяется разрядностью): 0 . . . 232-1 или 0 . . . 4294967295. К целым десятичным константам относятся их подтипы длинные и беззнаковые;

  • длинные целые десятичные(8 байт), в конце записи которых может добавляется буква (суффикс) L (или l), например 361327L, 271l. Диапазон длинных целых констант (определяется разрядностью): 0 . . . 264-1 или 0 . . . 18446744073709551615;

  • беззнаковые десятичные, в конце записи которых добавляется буква U (или u), например 62125U. Все константы по умолчанию – это величины без знака. Знаки (+) или (-) перед константой – это выполнение унарной операции +68, -842;

  • восьмеричные, в которых перед первой значащей цифрой записывается нуль (0), например 071, 0172, -0345. Не является восьмеричной константой 0973, т.к. в восьмеричной системе счисления нет цифры 9. Это также и не десятичная константа, потому что начинается с 0. Диапазон восьмеричных констант: 4-байтная 0 . . . 037777777777, 8-байтная 0 . . . 01777777777777777777777;

  • шестнадцатеричные, в которых перед первой значащей цифрой записывается пара символов нуль-икс (0x), например 0x5F, 0x3A4e, -0x1a. Диапазон шестнадцатеричных констант: 4-байтная 0 . . . 0xFFFFFFFF, 8-байтная 0 . . . 0xFFFFFFFFFFFFFFFF. Величину числовой константы в программе необходимо согласовывать с типом переменной, которой будет присвоено ее значение (типы переменных будут рассмотрены в следующем разделе). Если размер переменной в байтах будет меньше размера константы, будет производиться ее усечение, результат будет неверным.

Символьные константы

Единственный символ, заключенный в одинарные кавычки, например 'О', '2', '.' и т.п. является символьной константой. В Wisual C используется ASCII таблица кодировки символов. Для кодировки применяется 1 байт. Таким образом, символы можно закодировать значениями от 0 до 28-1 (0-255), всего 256 символов.

Таблица разделяется на две половины: левую и правую. Левая половина таблицы (международная: коды 0-127) неизменна и не зависит от национальных стандартов. В ней закодированы латинские буквы строчные и прописные, цифры, различные знаки (+-!?.,[] и т.п.), а также управляющие символы, не имеющие графического представления. Правая половина таблицы – национальная (коды128-255). Для использования кириллицы применяется кодовая страница 1251. В ней закодированы русские и украинские буквы строчные и прописные и некоторые специальные символы. Для разных кодовых страниц один и тот же код представляет разные символы.

Символы, не имеющие графического представления (коды 0-31), можно записывать, используя специальные комбинации, например '\n' (код 10), '\0' (код 0). Эти комбинации, называемые Esc-последовательностями, выглядят как два символа, хотя фактически это один символ. Управляющие Esc-последовательности используются для управления вводом-выводом:

Символ

16-ричный код

Назначение

'\a'

0x07

для кратковременной подачи звукового сигнала

'\b'

0x08

для перевода курсора влево на одну позицию

'\t'

0x09

горизонтальная табуляция

'\n'

0x0A

для перехода на новую строку

'\v'

0x0B

вертикальная табуляция

'\f'

0x0C

для подачи формата

'\r'

0x0D

для возврата каретки;

'\\'

0x5C

вывод символа \

'\''

0x27

вывод символа '

'\"'

0x22

вывод символа "

'\?'

0x3F

вывод символа ?

Так же можно представить любой двоичный образ одного байта: '\NNN', где NNN - от одной до трех восьмеричных цифр. Например, символ 'A' – латинская буква имеет код 6510сс = 1018сс = 4116сс. Этот символ можно задать в виде последовательности восьмеричных цифр '\101' (ведущий ноль не используется). Допускается и шестнадцатеричное задание кодов символов, которое представляется в виде: '\х41'. Таким образом символ А можно задавать константами 'A' ≡ '\101' ≡ '\х41'. Более того: 'A' ≡ '\А', '1' ≡ '\1'. Однако 'а' ≠ '\а', так как '\а' - управляющий символ.

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

Строковые константы - последовательность из нуля символов и более, заключенная в двойные кавычки, например: "Это строковая константа", "" – это пустая строка. Кавычки не входят в строку, а лишь ограничивают ее. Строка представляет собой массив из перечисленных элементов, в конце которого помещается байт с символом '\0'. Таким образом, число байтов, необходимых для хранения строки, на единицу превышает число символов между двойными кавычками. Внутри строки могут использоваться Esc-последовательности.

Примеры.

` 1. printf("Кафедра \" Компьютерной инженерии \" \n");

Функция printf () служит для вывода информации на экран. В параметре функции передается строковая константа. На экран печатается название кафедры в кавычках, после чего курсор переводится на новую строку:

Кафедра " Компьютерной инженерии ".

2. printf("Символ в апострофах \'К\' \n"); -

На экране будет напечатано:

Символ в апострофах 'К'

3. printf("Это пример строки,"

"которая записана\nкак несколько строк. "

"Компилятор С объединяет все строки\n"

"в одну строку.");

На экране будет напечатано:

Это пример строки, которая записана

как несколько строк. Компилятор С объединяет все строки

в одну строку.

4. Для объединения строк можно использовать символ (\), после которого не должно быть никаких других символов. Он указывает, что строковая константа продолжается на следующей строке с учетом всех пробелов, расположенных до первого символа.

printf("В действительности это одна строка.\n Символ \

Обратный слеш \\ указывает на продолжение строки.");

На экране будет напечатано:

В действительности это одна строка.

Символ Обратный слеш \ указывает на продолжение строки.

Соседние файлы в папке Методические указания