
Языки программирования / Литература по C++ / Денисова Э. В., Раков С. В. Программирование на языке СИ
.pdfДенисова Э. В., Раков С. В. Программирование на языке СИ – СПб; СПб ГИТМО (ТУ), 2003. – 74с.
В пособии даются базовые сведения для программирования на алгоритмическом языке СИ. Большое количество примеров упрощает понимание материала. Нестандартные ситуации и особые случаи выделены в специальные абзацы.
Учебное пособие предназначено для подготовки студентов высших учебных заведений, обучающихся по направлению подготовки 651900, 652300 по специальностям 210100, 181200 и 075300, по направлению подготовки 654000 по специальностям 072300, 190700 и 191100, по направлению подготовки 651100 по специальности 070700.
Пособие подготовлено на кафедре информатики и прикладной математики Санкт-Петербургского государственного института точной механики и оптики (технического университета).
Рецензенты: д.т.н., проф. Демин А.В., к.т.н., доц. Безруков В.А.
Одобрено на заседании кафедры информатики и прикладной математики 30 июня 2003 года, протокол № 10
©Санкт-Петербургский государственный институт точной механики и оптики (технический университет), 2003.
©Денисова Э. В., Раков С. В., 2003.
ОГЛАВЛЕНИЕ |
|
||
1. |
Элементы языка Си...................................................................................... |
4 |
|
|
1.1. |
Используемые символы.................................................................... |
4 |
|
1.2. |
Константы.......................................................................................... |
6 |
|
1.3. |
Идентификатор.................................................................................. |
9 |
|
1.4. |
Ключевые слова................................................................................. |
9 |
|
1.5. |
Комментарии ..................................................................................... |
10 |
2. |
Типы данных................................................................................................. |
12 |
|
|
2.1. |
Категории типов данных.................................................................. |
12 |
|
2.2. |
Целый тип данных ............................................................................ |
13 |
|
2.3. |
Данные с плавающей точкой ........................................................... |
15 |
|
2.4. |
Указатели ........................................................................................... |
16 |
|
2.5. |
Массивы ............................................................................................. |
17 |
|
2.6. |
Структуры.......................................................................................... |
18 |
|
2.7. |
Объединения ( смеси ) ...................................................................... |
19 |
|
2.8. |
Инициализация данных.................................................................... |
20 |
3. Выражения и операция присваивания ...................................................... |
22 |
||
|
3.1. |
Операнды и операции....................................................................... |
22 |
|
3.2. |
Преобразования при вычислении выражений ............................... |
23 |
|
3.3. |
Операции отрицания......................................................................... |
24 |
|
3.4. |
Операции взятия адреса и разадресации ........................................ |
25 |
|
3.5. |
Операция определения размера sizeof ............................................ |
26 |
|
3.6. |
Мультипликативные операции........................................................ |
26 |
|
3.7. |
Аддитивные операции...................................................................... |
27 |
|
3.8. |
Операции сдвига ............................................................................... |
28 |
|
3.9. |
Поразрядные операции..................................................................... |
28 |
|
3.10. Логические операции........................................................................ |
29 |
|
|
3.11. Операция последовательного вычисления..................................... |
30 |
|
|
3.12. Условная операция............................................................................ |
30 |
|
|
3.13. Операции увеличения и уменьшения ............................................. |
31 |
|
|
3.14. Простое и составное присваивание................................................. |
32 |
|
|
3.15. Приоритеты операций и порядок вычислений .............................. |
32 |
|
|
3.16. Преобразование типов...................................................................... |
33 |
|
4. |
Операторы..................................................................................................... |
36 |
|
|
4.1. |
Оператор выражение ........................................................................ |
36 |
|
4.2. |
Пустой оператор................................................................................ |
37 |
|
4.3. |
Составной оператор.......................................................................... |
37 |
|
4.4. |
Оператор условия if .......................................................................... |
38 |
|
4.5. |
Оператор выбора switch ................................................................... |
40 |
|
4.6. |
Оператор цикла while ....................................................................... |
42 |
|
4.7. Оператор цикла do while .................................................................. |
44 |
|
|
4.8. |
Оператор цикла for............................................................................ |
46 |
2
|
4.9. |
Оператор continue.............................................................................. |
48 |
|
4.10. Оператор return.................................................................................. |
49 |
|
|
4.11. Оператор goto .................................................................................... |
50 |
|
5. |
Связь указателей и массивов....................................................................... |
52 |
|
|
5.1. Указатели на многомерные массивы .............................................. |
53 |
|
|
5.2. |
Операции с указателями................................................................... |
54 |
|
5.3. |
Массивы указателей.......................................................................... |
56 |
|
5.4. |
Динамическое размещение массивов.............................................. |
57 |
6. |
Директивы препроцессора .......................................................................... |
60 |
|
|
6.1. |
Директива #include............................................................................ |
60 |
|
6.2. |
Директива #define.............................................................................. |
60 |
|
6.3. |
Директива #undef .............................................................................. |
62 |
7. |
Функции ........................................................................................................ |
63 |
|
|
7.1. Определение и вызов функций........................................................ |
63 |
|
|
7.2. Время жизни и область видимости объекта................................... |
73 |
|
|
7.3. |
Объявления функций........................................................................ |
79 |
|
7.4. |
Инициализация глобальных и локальных переменных................ |
79 |
3
1. Элементы языка СИ
1.1. Используемые символы
Множество символов используемых в языке СИ можно разделить на пять групп.
1. Символы, используемые для образования ключевых слов и идентификаторов (табл.1). В эту группу входят прописные и строчные буквы английского алфавита, а также символ подчеркивания. Следует отметить, что одинаковые прописные и строчные буквы считаются различными символами, так как имеют различные коды.
|
Таблица 1 |
|
Прописные буквы |
A B C D E F G H I J K L M N |
|
латинского алфавита |
O P Q R S T U V W X Y Z |
|
Строчные буквы |
a b c d e f g h i j k l m n |
|
латинского алфавита |
o p q r s t u v w x y z |
|
Символ |
_ |
|
подчеркивания |
|
|
2. Группа прописных и строчных букв русского алфавита и арабские цифры (табл.2).
|
Таблица 2 |
|
Прописные буквы |
А Б В Г Д Е Ж З И К Л М Н О П Р |
|
русского алфавита |
С Т У Ф Х Ц Ч Ш Щ Ы Ь Э Ю Я |
|
Строчные буквы |
а б в г д е ж з и к л м н о п р |
|
русского алфавита |
с т у ф х ц ч ш щ ъ ы ь э ю я |
|
Арабские цифры |
0 1 2 3 4 5 6 7 8 9 |
|
|
|
|
3. Знаки нумерации и специальные символы (табл. 3). Эти символы используются с одной стороны при описании процесса вычислений, а с другой - для передачи компилятору определенного набора инструкций.
|
|
|
Таблица 3 |
|
Символ |
Наименование |
Символ |
Наименование |
|
, |
запятая |
( ) |
круглые скобки |
|
. |
точка |
[ ] |
квадратные |
|
|
|
|
скобки |
|
; |
точка с |
{ } |
фигурные скобки |
|
|
|
4 |
|
|
|
запятой |
|
|
: |
двоеточие |
< |
меньше |
? |
вопросительн |
> |
больше |
|
ый знак |
|
|
! |
восклицатель |
~ |
тильда |
|
ный знак |
|
|
| |
вертикальная |
# |
номер (решетка) |
|
черта |
|
|
+ |
плюс |
% |
процент |
- |
минус |
& |
амперсанд |
* |
звездочка |
= |
равно |
|
|
" |
кавычки |
/ |
дробная черта |
' |
апостроф |
\ |
обратная дробная |
^ |
поразрядное |
|
черта |
|
исключающее или |
4.Управляющие и разделительные символы. К той группе символов относятся: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка. Эти символы отделяют друг от друга объекты, определяемые пользователем, к которым относятся константы и идентификаторы. Последовательность пробелов рассматривается компилятором как один символ.
5.Кроме выделенных групп символов в языке СИ широко используются так называемые, управляющие последовательности, т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность включает символ обратной дробной черты ( \ ) (обязательный первый символ) и комбинацию латинских букв или цифр (табл.4).
|
|
Таблица 4 |
Управляющая |
Наименование |
Шеснадцате- |
последовательность |
|
ричное |
|
|
значение |
\a |
Звонок |
007 |
\b |
Возврат на шаг |
008 |
\t |
Горизонтальная табуляция |
009 |
\n |
Переход на новую строку |
00A |
\v |
Вертикальная табуляция |
00B |
\r |
Возврат каретки |
00D |
\f |
Перевод формата |
00C |
\" |
Кавычки |
022 |
5
\' |
Апостроф |
027 |
\\ |
Обратная дробная черта |
05C |
\0ddd |
Символ набора кодов ЭВМ в |
|
|
восьмеричном представлении |
|
\0xddd |
Символ набора кодов ЭВМ в |
|
|
шестнадцатеричном представлении |
|
Последовательности вида \0ddd и \0xddd (здесь d обозначает цифру) позволяют представить символ из набора кодов ЭВМ как последовательность восьмеричных или шестнадцатеричных цифр соответственно. Например, символ возврата каретки может быть представлен различными способами:
\r - общая управляющая последовательность,
\015 - восьмеричная управляющая последовательность,
\x00D - шестнадцатеричная управляющая последовательность. Обратите внимание Если обратная дробная черта предшествует
символу, не являющемуся управляющей последовательностью (т.е. не включенному в табл.4) и не являющемуся цифрой, то эта черта игнорируется, а сам символ представляется как литеральный.
Например: символ \h представляется символом h в строковой или символьной константе.
Кроме определения управляющей последовательности, символ обратной дробной черты ( \ ) используется также как символ продолжения. Если за символом обратной дробной черты ( \ ) следует символ перехода на новую строку( \n ), то оба символа игнорируются, а следующая строка является продолжением предыдущей. Это свойство может быть использовано для записи длинных строк.
1.2. Константы
Константами называются фиксированные величины, значения которых задаются в программе. В языке СИ разделяют четыре типа констант: целые константы, константы с плавающей точкой, символьные константы и строковые литералы.
Целая константа - это десятичное, восьмеричное или шестнадцатеричное число, имеющее целое значение и представленное в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.
Десятичная константа состоит из одной или нескольких десятичных цифр, причем первая цифра не должна быть нулем (в противном случае число будет воспринято компилятором как восьмеричное).
6
Восьмеричная константа состоит из обязательного нуля и одной или нескольких восьмеричных цифр (среди цифр должны отсутствовать восьмерка и девятка, так как эти цифры не входят в восьмеричную систему счисления).
Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (в шестнадцатеричной системе счисления используется следующий набор цифр: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
|
|
Таблица 5 |
|
|
Примеры целых констант |
||
Десятичная |
Восьмеричная |
Шестнадцатеричная |
|
константа |
константа |
константа |
|
16 |
020 |
0x10 |
|
127 |
0117 |
0x2B |
|
240 |
0360 |
0xF0 |
|
Если требуется сформировать отрицательную целую константу, то используют знак "-" перед записью константы (который будет называться унарным минусом).
Пример 1:
-0x2A, - 088, -16 .
Каждой целой константе присваивается тип, определяющий вид преобразований, которые должны быть выполнены, если константа используется в выражениях.. Для того чтобы любую целую константу определить типом long, достаточно в конце константы поставить букву "l"
или "L".
Пример 2:
5l, 6l, 128L, 0105L, OX2A11L.
Константа с плавающей точкой - десятичное число, представленное в виде действительной величины с десятичной точкой или экспонентой. Формат имеет вид:
[+/-][ цифры ].[ цифры ] [ Е|e [+|-] цифры ] .
Число с плавающей точкой состоит из целой и дробной части и (или) экспоненты. Константы с плавающей точкой могут представляться с удвоенной точностью (имеют тип double). Для определения отрицательной
7
величины необходимо сформировать константное выражение, состоящее из знака минуса и положительной константы.
Пример 3:
115.75, 1.5Е-02, -0.025, .075, -0.85Е02
Символьная константа представляется символом, заключенным в апострофы. Управляющая последовательность рассматривается как одиночный символ и ее допустимо использовать в символьных константах. Значением символьной константы является числовой код символа. Символьные константы имеют тип int и при преобразовании типов дополняются знаком.
Пример 4:
' ' - пробел , 'A' - буква A .
Строковая константа (литерал) - последовательность символов (включая строковые и прописные буквы русского и латинского алфавита, а также цифры) заключенные в кавычки ( " " ) .
Пример 5:
"Си - хороший язык",
"1.2E+03 - это то же самое, \n что и 1200 ".
Отметим, что все управляющие символы, кавычка ( " ), обратная дробная черта ( \ ) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями (например, для занесения символа ( “ ) внутри литерала его необходимо записать в виде ( \” )). Каждая управляющая последовательность представляется как один символ. Например, при печати литерала "1.2E+03 - это то же самое, \n что и 1200 " его часть "1.2E+03 - это то же самое, " будет напечатана на одной строке, а вторая часть " что и 1200 " на следующей строке.
В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью ( \0 ).
Строковый литерал имеет тип char[]. Это означает, что строка рассматривается как массив символов.
8
Обратите внимание: число элементов массива равно числу символов в строке плюс 1, так как нулевой символ (символ конца строки) также является элементом массива. Например, пустой строковый литерал “” рассматривается как массив из одного элемента – нуль-символа.
1.3. Идентификатор
Идентификатор - это имя программного объекта. Для образования идентификаторов могут быть использованы строчные или прописные буквы латинского алфавита, цифры и знак подчеркивания ( _ ). Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Два идентификатора, для образования которых используются совпадающие строчные и прописные буквы, считаются различными.
Пример 6:
abc, ABC, |
A128B, |
a128b, |
x_5, |
X_5 . |
Идентификатор создается на этапе объявления переменной, функции, структуры и т.п. Затем его можно использовать в последующих операторах разрабатываемой программы. Следует отметить, что идентификатор не должен совпадать с ключевыми словами (имеющими специальное значение для компилятора СИ), с зарезервированными словами и именами функций библиотеки компилятора языка СИ.
Обратите внимание: компилятор допускает любое количество символов в идентификаторе, хотя значимыми являются первые 31 символ.
1.4. Ключевые слова
Ключевые слова - это зарезервированные идентификаторы, которые используются в языке СИ специальным образом. Их можно использовать только по их прямому назначению.
Приведем список ключевых слов: asm, auto
break
case, char, const, continue default, do, double
else, enum, extern float, for
goto if, int
9
long
register, return
short, signed, sizeof, static, struct, switch tupedef
unsigned, union void
while
Кроме того в рассматриваемой версии реализации языка СИ, зарезервированными являются следующие слова:
_asm, fortran, near, far, cdecl, huge, paskal, interrupt .
Ключевые слова far, huge, near позволяют определить размеры указателей на области памяти. Ключевые слова _asm, cdelc, fortran, pascal служат для организации связи с функциями, написанными на других алгоритмических языках, а также для использования команд языка ассемблера непосредственно в теле разрабатываемой программы на языке СИ.
Обратите внимание: ключевые слова не могут быть использованы в качестве идентификаторов.
1.5. Комментарии
Комментарий - это набор символов, которые игнорируются компилятором, т.е. не относятся к исполняемым операторам программы. Комментарии начинаются с символов /* и заканчиваются символами */. На комментарии накладываются некоторые ограничения. Внутри набора символов, которые представляют комментарий, не может быть специальных символов, определяющих начало и конец комментариев (соответственно /* и */ ). Отметим, что комментарии могут заменить как одну строку, так и несколько.
Пример 7 :
/* комментарий к программе */ /* начало алгоритма */
или /* комментарий можно записать в следующем виде, однако
надо
быть осторожным, чтобы внутри последовательности, которая игнорируется компилятором, не попались операторы программы, которые также будут игнорироваться */
10