Изучаем язык программирования С

Предыдущая тема Следующая тема Перейти вниз

Изучаем язык программирования С

Сообщение  Viktor2312 в Пт Апр 22 2016, 11:54

1. Описание Языка СИ.


1.1. Элементы Языка СИ.


1.1.1. Используемые символы.


Множество символов используемых в языке СИ можно разделить на пять групп.

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


2. Группа прописных и строчных букв русского алфавита и арабские цифры (табл.2).


3. Знаки нумерации и специальные символы (табл. 3). Эти символы используются с одной стороны для организации процесса вычислений, а с другой - для передачи компилятору определенного набора инструкций.


4. Управляющие и разделительные символы. К этой группе символов относятся: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка. Эти символы отделяют друг от друга объекты, определяемые пользователем, к которым относятся константы и идентификаторы. Последовательность разделительных символов рассматривается компилятором как один символ (последовательность пробелов).

5. Кроме выделенных групп символов в языке СИ широко используются так называемые, управляющие последовательности, т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность строится на основе использования обратной дробной черты (\) (обязательный первый символ) и комбинацией латинских букв и цифр (табл.4).


Последовательности вида \ddd и \xddd (здесь d обозначает цифру) позволяет представить символ из набора кодов ПЭВМ как последовательность восьмеричных или шестнадцатеричных цифр соответственно. Например символ возврата каретки может быть представлен различными способами:

\r - общая управляющая последовательность,

\015 - восьмеричная управляющая последовательность,

\x00D - шестнадцатеричная управляющая последовательность.

Следует отметить, что в строковых константах всегда обязательно задавать все три цифры в управляющей последовательности. Например отдельную управляющую последовательность \n (переход на новую строку) можно представить как \010 или \xA, но в строковых константах необходимо задавать все три цифры, в противном случае символ или символы следующие за управляющей последовательностью будут рассматриваться как ее недостающая часть. Например:

"ABCDE\x009FGH" данная строковая команда будет напечатана с использованием определенных функций языка СИ, как два слова ABCDE FGH, разделенные 8-ю пробелами, в этом случае если указать неполную управляющую строку "ABCDE\x09FGH",то на печати появится ABCDE=|=GH, так как компилятор воспримет последовательность \x09F как символ "=+=".

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

символ \h представляется символом h в строковой или символьной константе.

Кроме определения управляющей последовательности, символ обратной дробной черты (\) используется также как символ продолжения. Если за (\) следует (\n), то оба символа игнорируются, а следующая строка является продолжением предыдущей. Это свойство может быть использовано для записи длинных строк.
avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Изучаем язык программирования С

Сообщение  Viktor2312 в Пт Апр 22 2016, 12:54

1.1.2. Константы.


Константами называются перечисление величин в программе. В языке СИ разделяют четыре типа констант: целые константы, константы с плавающей запятой, символьные константы и строковые литералы.

Целая константа - это десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.

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

Восьмеричная константа состоит из обязательного нуля и одной или нескольких восьмеричных цифр (среди цифр должны отсутствовать восьмерка и девятка, так как эти цифры не входят в восьмеричную систему счисления).

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


Если требуется сформировать отрицательную целую константу, то используют знак "-" перед записью константы (который будет называться унарным минусом). Например: -0x2A, -088, -16.

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

- десятичные константы рассматриваются как величины со знаком, и им присваивается тип int (целая) или long (длинная целая) в соответствии со значением константы. Если константа меньше 32768, то ей присваивается тип int в противном случае long.

- восьмеричным и шестнадцатеричным константам присваивается тип int, unsigned int (беззнаковая целая), long или unsigned long в зависимости от значения константы согласно табл. 5.


Для того чтобы любую целую константу определить типом long, достаточно в конце константы поставить букву "l" или "L". Пример:

5l, 6l, 128L, 0105L, 0x2A11L.

Константа с плавающей точкой - десятичное число, представленное в виде действительной величины с десятичной точкой или экспонентой. Формат имеет вид:

[ цифры ].[ цифры ] [ Е|e [+|-] цифры ] .

Число с плавающей точкой состоит из целой и дробные части и (или) экспоненты. Константы с плавающей точкой представляют положительные величины удвоенной точности (имеют тип double). Для определения отрицательной величины необходимо сформировать константное выражение, состоящее из знака минуса и положительной константы.

Примеры: 115.75, 1.5Е-2, -0.025, .075, -0.85Е2.

Символьная константа - представляется символом заключенном в апострофы. Управляющая последовательность рассматривается как одиночный символ, допустимо ее использовать в символьных константах. Значением символьной константы является числовой код символа.
Примеры:

' '- пробел,

'Q'- буква Q,

'\n' - символ новой строки,

'\\' - обратная дробная черта,

'\v' - вертикальная табуляция.

Символьные константы имеют тип int и при преобразовании типов дополняются знаком.

Строковая константа (литерал) - последовательность символов (включая строковые и прописные буквы русского и латинского алфавитов, а также цифры) заключенные в кавычки (") . Например: "Школа N 35", "город Пятигорск", "YZPT КОД".

Отметим, что все управляющие символы, кавычка ("), обратная дробная черта (\) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями. Каждая управляющая последовательность представляется как один символ. Например, при печати литерала "Школа \n N 35" его часть "Школа" будет напечатана на одной строке, а вторая часть "N 35" на следующей строке.

Символы строкового литерала сохраняются в области оперативной памяти. В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0.

Строковый литерал имеет тип char . Это означает, что строка рассматривается как массив символов. Отметим важную особенность, число элементов массива равно числу символов в строке плюс 1, так как нулевой символ (символ конца строки) также является элементом массива. Все строковые литералы рассматриваются компилятором как различные объекты. Строковые литералы могут располагаться на нескольких строках. Такие литералы формируются на основе использования обратной дробной черты и клавиши ввод. Обратная черта с символом новой строки игнорируется компилятором, что приводит к тому, что следующая строка является продолжением предыдущей. Например:

"строка неопределенной \n

длины"

полностью идентична литералу

"строка неопределенной длинны" .

Для сцепления строковых литералов можно использовать символ (или символы) пробела. Если в программе встречаются два или более строковых литерала, разделенные только пробелами, то они будут рассматриваться как одна символьная строка. Этот принцип можно использовать для формирования строковых литералов занимающих более одной строки.
avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Изучаем язык программирования С

Сообщение  Viktor2312 в Пт Апр 22 2016, 13:36

1.1.3. Идентификатор.


Идентификатором называется последовательность цифр и букв, а также специальных символов, при условии, что первой стоит буква или специальный символ. Для образования идентификаторов могут быть использованы строчные или прописные буквы латинского алфавита. В качестве специального символа может использоваться символ подчеркивание (_). Два идентификатора для образования которых используются совпадающие строчные и прописные буквы, считаются различными. Например: abc, ABC, A128B, a128b .

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

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

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

В третьих, на идентификаторы используемые для определения внешних переменных, должны быть наложены ограничения, формируемые используемым редактором связей (отметим, что использование различных версий редактора связей, или различных редакторов накладывает различные требования на имена внешних переменных).
avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Изучаем язык программирования С

Сообщение  Viktor2312 в Пт Апр 22 2016, 13:46

1.1.4. Ключевые слова.


Ключевые слова - это зарезервированные идентификаторы, которые наделены определенным смыслом. Их можно использовать только в соответствии со значением известным компилятору языка СИ.


Кроме того в рассматриваемой версии реализации языка СИ, зарезервированными словами являются :

_asm, fortran, near, far, cdecl, huge, paskal, interrupt .

Ключевые слова far, huge, near позволяют определить размеры указателей на области памяти. Ключевые слова _asm, cdelc, fortran, pascal служат для организации связи с функциями написанными на других языках, а также для использования команд языка ассемблера непосредственно в теле разрабатываемой программы на языке СИ.


Основное, это то, что ключевые (зарезервированные) слова не могут быть использованы в качестве идентификаторов.
avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Изучаем язык программирования С

Сообщение  Viktor2312 в Пт Апр 22 2016, 13:57

1.1.5. Использование комментариев в тексте программы.


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

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

Неправильное определение комментариев.

    /* комментарии к алгоритму /* решение краевой задачи */ */
     или
    /* комментарии к алгоритму решения */ краевой задачи */

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

// однострочный комментарий

Однострочный комментарий начинается с // и заканчивается (внутренним) кодом
перехода на другую строку. Как и блок комментария, он игнорируется программой
и не занимает места в памяти.

// вот так выглядит однострочный комментарий

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

// Это комментарий

// will define runtime later
avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Изучаем язык программирования С

Сообщение  Viktor2312 в Сб Апр 23 2016, 19:57

Минимальная программа на Си может быть такой:

main(){}

Эта программа не делает ни чего полезного - но это уже программа и она показывает что в программе на языке  Си - должна быть главная функция  main - обязательно! Реальные программы на Си конечно больше.

Задача программы МК:  читать числа из регистров МК,  делать что-то с ними и записывать числа в регистры. Только так программа может общаться с МК.

Регистры МК в программе на Си имеют названия как и в DataSheet и так как  числа в большинстве из них можно менять - для программы регистры являются по сути переменными.

Чтобы поместить число в переменную (в регистр)   в  Си  есть оператор присваивания  - это знак   =    ("равно" ).    В  Си этот знак  не означает равенство , =    в Си означает  вычислить результат того что справа от оператора присваивания  и поместить этот результат в переменную находящуюся левее оператора присваивания.

PORTB  = PINB  + 34;/* Эта строчка на Си означает. Взять (прочитать, считать) значение переменной (регистра) PINB, затем прибавить к нему число 34 и поместить результат в переменную PORTB */

ПЕРЕМЕННАЯ  = PINC;  /* Эта строчка на Си означает. Взять (прочитать, считать) значение переменной (регистра) PINC и поместить результат в переменную с именем ПЕРЕМЕННАЯ */


Строка где переменная стоит слева от =  но через знак &

PORTB & = 0x23;

на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23  и поместить (записать, присвоить) результат в переменную PORTB.


Строка где переменная стоит непосредственно слева от =

PORTB = 0x23;

на Си означает - не читая содержимое переменной PORTB присвоить ей значение 0x23


Результатом поразрядных (побитных)  логических операций : &      |     ^      ~  является    число, которое может быть интерпретировано компилятором как "истина" если оно не ноль и "ложно" если число ноль.


Числа  

В компиляторе можно записывать в виде указанном в его Help'е !

например  -  Целые числа могут быть записаны:

• - в десятичной форме - 1234

• - в двоичной форме с префиксом 0b так:  0b101001

• - в шестнадцатеричной форме с префиксом 0x так:  0x

• - в восьмеричной форме с префиксом 0  так: 0775

Числа с плавающей точкой имеют в записи эту точку и какое либо число после этой точки, так:   61.234   или так:  73.0  и так:  .786  и могут иметь в конце   F   вот так: 61.234F


PORTA++;   /* Эта строчка на Си означает. Взять значение переменной PORTA добавить к ней 1 и записать результат обратно в PORTA  говорят: Инкрементировать регистр PORTA */

PORTC--;       /* Эта строчка на Си означает обратное действие! Декрементировать - вычесть 1 из значения регистра PORTC  */

Инкремент и  декремент удобно использовать для изменения значения различных переменных счетчиков.  
Важно помнить что они имеют очень низкий приоритет - поэтому чтобы быть уверенными в порядке выполнения желательно писать их отдельной строчкой программы!

Когда инкремент или декремент используется в выражении то важно где стоят два знака + или -  перед  переменной или  после переменной :


a=4;
b=7;

a = b++;    /* Эта строчка на Си означает Взять значение переменной b присвоить его переменно a затем добавить 1 к переменной b  и сохранить результат в b. В результате a будет содержать число 7 а b будет содержать число 8  */

a=4;
b=7;

a = ++b;    /* Эта строчка на Си означает Взять значение переменной b затем добавить к нему 1 и сохранить результат в b и этот же результат присвоить a. Теперь  a будет содержать число 8  и b будет содержать число 8 */

avatar
Viktor2312
Гуру+

Сообщения : 10337
Дата регистрации : 2012-08-10
Возраст : 38
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения