Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст_лекций_Си.doc
Скачиваний:
18
Добавлен:
16.03.2016
Размер:
1.06 Mб
Скачать

Вывод: Пробелы употреблять везде, где это допустимо и улучшает читабельность программы.

Пример:

if ( a<b && b<c ) {

    1. Комментарии

Цель – пояснить логику, облегчить отладку, тестирование и сопровождение программ.

Комментарий должен учитывать уровень возможных читателей текста программы (кроме автора, конечно).

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

Комментарии должны представлять собой правильное предложение без сокращений слов и без орфографических ошибок.

Формат /* <произвольный текст> */

ЗАМЕЧАНИЕ <...> в описании правил записи (формата) конструкций языка означают понятие языка, в программе не записываются.

Пример /* Это предложение – комментарий! */

Внимание!!! Нет необходимости комментировать ключевые слова и стандартные действия!

Пример

for ( k=0, k<10, k += 0.1 ) /* Цикл по параметру к */ Неверно!

long sum, m; /* Описание переменных */ Неверно!

/* сумма элементов массива,

наименьший элемент массива */ Верно!

Введение в си

Глава 2 элементы данных

ДАННЫЕ – это значения, которые могут задаваться объектам программы и использоваться при ее выполнении.

По организации различают скаляры (одиночные значения): переменные, константы и указатели, и совокупности: массивы, структуры и файлы.

Элемент данных имеет тип и изображение. ТИП – множество допустимых значений элемента данных и множество операций над ними. Элементом данных какого-либо типа является переменная или константа.

    1. Константы

Константами называют неизменяемые величины. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду, т.е. тип константы определяется ее изображением. (Программист может задать тип константы самостоятельно, но это будет не совсем константа!)

Тип

константы

Формат

Размер

Примеры

Целая

Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это число не ноль.

2(4)

8, 0, 2345

Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7)

2(4)

01, 00, 066, 07654

Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7, 8,9, A, B, C, D, E, F)

2(4)

0xA3, 0x1B5, 0X0FF,

0x12345

Тип

константы

Формат

Размер

Примеры

Вещественная

Десятичный:

[ цифры ] . [ цифры ]

могут быть опущены либо целая, либо дробная части, но не обе сразу .

8

8.8146

0.567, 23.

Экспоненциальный:

[ цифры ].[ цифры ]{E|e}[цифры]

могут быть опущены либо целая, либо дробная части, но не обе сразу. Если указаны обе части символ точки обязателен.

8

0.1E7,

0.1e+7

0.1E–7

.11e–7

1E10

Тип

константы

Формат

Размер

Примеры

Символьная

Один символ, заключенный в апострофы

1

‘A’, ‘a’, ‘*’, ‘ ’

Два символа, заключенных в апострофы

Первый символ размещается в байте с меньшим адресом.

2

‘\n’, ‘\a’, ‘\012’, ‘\’’

Символ косой обратной черты используют для представления:

  • управляющих последовательностей символов, не имеющих графического изображения;

  • символов: ' , \ , ? , “ ;

  • любого символа с помощью его шестнадцатеричного или восьмеричного кода. Числовое значение должно находиться в диапазоне от 0 до 255.

Пустая символьная константа не допустима.

Тип

константы

Формат

Размер

Примеры

Строковая

последовательность символов, заключенная в кавычки

кол-во символов+

+1 байт

“Ура!”

“\t Значение R=\0xF5 \n”

В конец каждой строковой константы компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на 1 больше количества символов в ней. Поэтому пустая строка имеет длину в 1 байт!

Обратите внимание на разницу между строкой символов “A” и символом 'A'.

Управляющие последовательности могут встречаться и в строковых константах.

Например:

“Челябинский завод \“ Теплоприбор \” ”

Длинную строковую константу можно разместить на нескольких строках, используя в качестве знака переноса обратную косую черту, за которой сразу следует перевод строки.

Например:

“ Это очень длинная, длинная, \

длинная, длинная, \

длинная строка”

    1. Переменные

Тип константы определяется ее изображением. Для переменной необходима специальная конструкция языка – ОПИСАНИЕ.

ВСЕ ПЕРЕМЕННЫЕ В ЯЗЫКЕ Си ДОЛЖНЫ БЫТЬ ОБЪЯВЛЕНЫ!

Любители Бейсика, забудьте о том, чтобы использовать большую кучу переменных без объявления! В принципе, объявлять переменные до их использования – это просто правило хорошего тона. Кроме того, оно позволяет компилятору разделить типы, переменные и функции.

В языке различают понятия описания переменной и ее определения (объявления). Описание устанавливает свойства объекта: его шаг (целый), размер (4 байта). Объявление наряду с этим вызывает выделение памяти.

Формат:

<описание>:= [модификатор_типа] <тип_переменной> <список>

<список>:= <имя_переменной> [= начальное значение, …, имя_переменной [= начальное_значение]... ];

ВНИМАНИЕ! Все переменные должны быть описаны до их использования (по описаниям выделяется память для них).

      1. Базовые типы данных Си

  • Целые

Тип – integer, в программе int.

Размер переменной типа int может быть 16 или 32 бита.

Пример: описание переменных

int i=0, kol=5, hod;

Тип

Размер

Диапазон значений

int

2

-32768 …+32768

int

4

-2147483648 …+2147483647

Объекты некоторого базового типа могут быть модифицированы. С этой целью используются специальные ключевые слова – модификаторы.

Рассмотрим 4 из них: unsignet, signet, short, long. Модификатор записывается перед спецификацией. Если после модификатора опущен спецификатор, то он int (long int Along A).

Модификаторы типа:

short – Явно указывает компилятору, что под данную переменную необходимо отвести 2 байта, независимо от разрядности платформы.

long – Явно указывает компилятору, что под данную переменную необходимо отвести 4 байта, независимо от разрядности платформы.

signed – Указывает компилятору, что данная переменная является знаковой (то есть может принимать как положительные, так и отрицательные значения).

unsigned –Указывает компилятору, что данная переменная является беззнаковой (то есть может принимать только положительные значения).

В общем случае:

объект (short) <= объект (int) <= объект (long)

IBM PC

байты

диапазон

short

2

от –32768 до 32767

int

2

long

4

( –2147483648 … 2147483647 )

Пример: описание переменных

int i, kol;

short low, high;

long max;

  • Данные с плавающей точкой

Существуют три описания для действительных чисел, отличающихся размером выделяемой памяти и точностью представления

float 4 байт 6…7 десятичных цифр

double 8 байт 16 … …

long double 10 байт 16 … …

Все КОНСТАНТЫ имеют тип double!

float step_x=0.01, step_y=0.5;

double koord_x, koord_y;

IBM PC

байты

диапазон

float

4

3.4e–38<|x|<3.4e38

double

8

1.7e–308<|x|<1.7e308

long double

10

1e–3000<|x|<1e3000(приблизительно)

  • Символы (знаки)

Для переменных символьного типа используют служебное слово char (character). Длина переменной – 1 байт. Диапазон значений [–128, 127].

Обратите внимание: тип char может являться как знаковым, так и беззнаковым, в зависимости от конкретного компилятора. Т.е. переменные типа char так же могут быть модифицированы с использованием модификаторов unsigned / signed. Поэтому, чтобы быть уверенным в допустимых значениях, используйте типы signed char и unsigned char.

Пример: char array_name, step;

  • Логические данные

В Си нет. Замена – целые. 0  false, (НЕ)0  true

    1. Указатели

Указатели (ссылки) – это переменные, показывающие место или адрес памяти, где расположены другие объекты (переменные, функции и т.п.). Т.к. указатель содержит адрес некоторого объекта, то через него можно обращаться к этому объекту.

У такого выражения есть АДРЕС, ТИП и, разумеется, ЗНАЧЕНИЕ. Но у него нет ИМЕНИ И нет ОБЛАСТИ ВИДИМОСТИ.

Формат: описания переменной указателя

<тип> *<имя> [,*<имя>]...;

Объекты, состоящие из знака* и адреса необходимо объявлять!

Объявление вида: char *d; говорит о том, что значение, записанное по адресу d, имеет тип char.

Пример:

int *kol, *num; Признаком указателя служит *.

double *lenght;

Операции над указателями: над указателями определены две унарные операции: & *

Унарная операция & возвращает адрес объекта в явном виде, поэтому оператор:

y = &x;

присваивает адрес x переменной y. Операцию & нельзя применять к константам и выражениям. Операция применима только к объектам, имеющим имя и размещенным в памяти.

Унарная операция * воспринимает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содержимого. Поэтому, оператор:

z = *y;

присваивает z значение переменной, записанной по адресу y.

int *a;

Объявляет переменную a типа «указатель на int», то есть содержащую адрес некоторого целого значения.

&x

Возвращает адрес переменной a

*p

Возвращает "переменную" по адресу, находящемуся в переменной p.

Пример: int x, y, *px;

px=&x;

y=*px;

Это эквивалентно y = x;

Указатели могут встречаться в выражениях. Если y – указатель на целое ( int *y; ), то *y может появляться там же, где и любая другая переменная, не являющаяся указателем.

Пример:

*y = 7; //заносим 7 в ячейку памяти по адресу y

*x = *x*5; //увеличиваем значение по адресу x в 5 раз

(*z)++; //добавляем 1 к содержимому ячейки памяти с адресом z, круглые скобки обязательны