Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Приведем список ключевых слов

auto double int struct break else long switch register tupedef char extern return void case float unsigned default for signed union do if sizeof volatile continue enum short while  

 

Кроме того в рассматриваемой версии реализации языка СИ, зарезервированными словами являются: _asm, fortran, near, far, cdecl, huge, paskal, interrupt.

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

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

 

 

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

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

/* комментарии к программе */ или // начало алгоритма

Типы данных и их объявление

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

Формат объявления переменных имеет следующий вид:

[<storage modifier>]<type><identifier>

<storage modifier> - Спецификатор класса памяти - определяется одним из четырех ключевых слов языка СИ: auto, extern, register, static, и указывает,каким образом будет распределяться память под объявляемую переменную, с одной стороны, а с другой, область видимости этой переменной, т.е., из каких частей программы можно к ней обратиться. Не объязательный элемент и он нужен только в некоторых случаях.

<extern> - если переменная может использоваться в других файлах исходного кода программы;

<static> - если переменная локальная, то объявлена в какой либо функции после скобки и должна сохранять свои значения до следующего вызова этой функции;

<register> - разместить переменную в регистрах МК.

Глобальные переменные объявляются до появления их в тексте какой ни будь функции. После объявления глобальные переменные доступны в любой функции программы.

Локальные переменные объявляются в самом начале функций- т.е. после фигурной скобки.

<type definition>- спецификатор типа данных, которых может хранить переменная.

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

Целые типы: Плавающие типы: char float int double short long double long signed unsigned  

 

Например,

Unsigned char - хранит число от 0 до 255(байт);

Unsigned Int - хранит число от 0 до 65535 (два байта);

Unsigned long Int- хранит число от 0 до 4294967295 (четыре байта).

Вместо Unsigned char можно писать просто char, так как компилятор по умолчанию считает char, беззнаковым.

Signed char - означает знаковую переменную и хранит число от -128 до 127.

Ключевые слова signed и unsigned указывают как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned (беззнаковый), то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Например:

unsigned int n;unsigned int b;int c; (подразумевается signed int c);unsigned d; (подразумевается unsigned int d);signed f; (подразумевается signed int f).

Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору-типа. Объекты с типом const представляют собой данные используемые только для чтения, т.е. этой переменной не может быть присвоено новое значение. Отметим, что если после слова const отсутствует спецификатор-типа, то подразумевается спецификатор типа int. Если ключевое слово const стоит перед объявлением составных типов (массив, структура, смесь, перечисление), то это приводит к тому, что каждый элемент также должен являться немодифицируемым, т.е. значение ему может быть присвоено только один раз.

Примеры:

const double A=2.128E-2;const B=286; (подразумевается const int B=286) consnant char_ string constant []=”this is a string constant”

Данные плавающего типа

Для переменных, представляющих число с плавающей точкой используются следующие модификаторы-типа: float, double, long double (в некоторых реализациях языка long double СИ отсутствует).

Величина с модификатором-типа float занимает 4 байта. Из них 1 бит отводится для знака, 8 бит для избыточной экспоненты и 23 бита для мантиссы. Отметим, что старший бит мантиссы всегда равен 1, поэтому он не заполняется, в связи с этим диапазон значений переменной с плавающей точкой приблизительно равен от 3.14E-38 до 3.14E+38. Величина типа double занимает 8 байт в памяти. Ее формат аналогичен формату float. Биты памяти распределяются следующим образом: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы. С учетом опущенного старшего бита мантиссы диапазон значений равен от 1.7E-308 до 1.7E+308.

Примеры:

float f, a, b;double x,y;

 

<identifier>- имя переменной. Например imy peremennoi.

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

Например, moya peremennaya, _ vasha funkzia.

Глобальные переменные, а также локальные переменные с модификатором static при старте и рестарте программы равны 0, если им не присвоили иные значения.

Несколько примеров объявления переменных:

Unsigned Char my_peremen=34; /* my_peremen определен как Unsigned Char, с присвоением значения 34 (можно и без присвоения) */

Unsigned Int big_ peremen=34634; /* big_ peremen объявлен как Unsigned Int */.

Объявление массива

Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

спецификатор-типа описатель [константное - выражение];

спецификатор-типа описатель [ ];

Описатель - это идентификатор массива.

Спецификатор-типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

Константное-выражение в квадратных скобках задает количество элементов массива. Константное-выражение при объявлении массива может быть опущено в следующих случаях:

-при объявлении массив инциализируется;

-массив объявлен как ссылка на массив, явно определенный в другом файле;

-массив объявлен как формальный параметр функции.

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

Каждое константное выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два константных выражения, трехмерного – три и т.д. Отметим, что в языке Си первый элемент массива имеет индекс равный 0.

Пример:

int a[2][3]; /*представлено в виде матрицы a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] */ double b[10]; /* вектор из 10 элементов имеющих тип double */  

 

Char mass [11, 22, 33]- нумерация элементов начинается с 0, т.е. элементы данного массива называются как mass[0], mass[1] и в них хранятся числа 11, 22, 33. Где то в программе элементу можно присвоить значение,например mass[1]=210. Можно элементам не присваивать значения.

Строковая переменная или массив содержащий строку символов, например,

Char stroke [6]=”Hello” определяет 6 элементов, хотя в ней содержится всего пять символов. Шестым элементом является управляющий символ, который добавляется в конце строки \0.

Символьный массив можно объявить также без указания количества элементов.

Например,

Char str []=” объявление символьного массива”

Выражения и присваивания

Опепранды и операции

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

В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.

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

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

Примеры:

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

2. ПЕРЕМЕННАЯ=PINC; /* Эта строчка на Си означает взять (прочитать) значение переменной (регистра) PINC и поместить результат в переменную с именем ПЕРЕМЕННАЯ */    
3.Строка где переменная стоит слева от “ = “ но через знак & PORTB& =0x23; на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в переменную PORTB 4. Строка где переменная стоит непосредственно слева от “=” PORTB=0x23; на Си означает - не читаясодержимое переменной PORTB присвоить ей значение 0x23 уничтожив то что было там раньше.
Вместо & "И" (AND - только 1 и 1 дают 1) могут быть и другие побитные логические операции: | "ИЛИ" (OR только 0 и 0 дают 0) ^ "Исключающее ИЛИ" (XOR изменить бит напротив "1") ~ "инвертирование битов" (INV изменить биты регистра на противоположные символы) и арифметические операции: + - * / %    
    С оператором присваивания используются сокращения:      
ДЛИННАЯ ЗАПИСЬ   СМЫСЛ   СОКРАЩАЕТСЯ ДО
x = x + 1;   добавить 1   x++; или ++x;
x = x - 1;   вычесть 1   x--; или --x;
x = x + y;   прибавить y   x += y;
x = x - y;   вычесть y   x -= y;
x = x * y;   умножить на y   x *= y;
x = x / y;   поделить на y   x /= y;
x = x % y;   остаток от деления   x %= y;
x--;   вычесть 1   x -= 1;
x++;   добавить 1   x += 1;
                 

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

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 */ 1.2.2 Арифметические операции в Си x + y// сложениеx - y// вычитаниеx * y// умножение x / y/* деление. Если числа целые результат - целое число с отброшенной дробной частью - не округленное. Т.е. если в результате деления получается 6.23411 или 6.94 то результат будет просто целое число 6. Если числа с плавающей точкой, то есть float или double и записываются с точкой и числом после точки, то и результат будет число с плавающей точкой без отбрасывания дробной части 131.9739 / 6.18 даст 21.355 */ x % y// вычислить остаток от деления нацело Примеры:
5 / 2// даст 2 5 % 2// даст 1 75 / 29// даст 2 75 % 29// даст 17  
   

1.2.4. Операторы сравнения (или отношения):

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

     

x < y // X меньше Y
x > y // больше
x <= y // меньше или равно
x >= y // больше или равно
x == y // равно
x!= y /* не равно Результат выполнения этих операторов: "истина" это "1" (точнее "не ноль"), "ложно" это "0". Значения хранимые в переменных (в регистрах)
х
и у НЕ изменяются. Берутся (считываются) значения хранящиеся (или содержащиеся) в переменных и сравниваются */

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

|| // "ИЛИ" - только "ложь" и "ложь"

// дают "ложь"

&& // "И" - только "истина" и "истина"
// дают "истина"

! // "НЕ" - логическое отрицание

В результате логической операции получается НЕ ЧИСЛО, а логическое значение "истина" или "ложь".

Для логических операций && и || берутся результаты выражений слева и справа от знака операции преобразованные в "истину" или "ложь" и определяется логический результат операции.

Компилятор результат "истина" превращает в 1 а не в любое отличное от 0 число.

Логические операции могут объединять несколько проверяемых условий.

Например:

if ((выражение1)&&((выражение2)||(выражение3)))
{ /* Код программы здесь будет выполняться если:

Выражение1 "Истина" (значит не ноль) и хотя бы одно из выражений 2 и 3 тоже "Истина" (значит не ноль).
};

1.3. Используемые конструкции на Си

1. if (){} else {}; идеальная конструкция если нужно выполнить какую то часть программы при наличии каких либо условий или при их отсутствии:

  if (выражение) { код на Си /* выполнить этот код если выражение "истина" - т.е. результат его вычисления не ноль */ } else { код на Си /* выполнить этот код если выражение "ложь" - т.е. результат его вычисления равен нулю */ };

} else { не обязательный элемент конструкции, без него конструкция выглядит так:

if (выражение) { код на Си /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль */
};

Напимер:

if (PINB.5) { выполнепние кода Си };
/* если на ножке PB5 есть "1" (не "0" значит "истинно") то программа выполнит код, а если на ней "0" (значит "ложно") то не сделает, а просто пойдет дальше, на следующую строку */

2.while (){};условный цикл (цикл с условием) - используется если нужно выполнять какой то код программы пока выполняется (существует,
"истино" - значит "не ноль") некоторое условие, результат вычисления выражения:

while ( выражение ) {код на Си /* выполнить этот код если выражение "истина" - т.е. результат его вычисления не ноль. Пока выполняется этот код выражение не проверяется на истинность.После выполнения кода происходит переход к строке while снова проверять истинность выражения */
};

Например:

while (PINA.6) { выполнение кода Си };
/* пока на ножке PA6 есть "1" (не "0" значит "истинно") то программа выполнит код, и опять проверит что на PA6 */ Если бит_6 стал "0" то программа пойдет дальше не выполняя того что в { }

Цикл while имеет вариант

Do - while

при котором код в { } выполняется по меньшей мере один раз независимо от истинности условия в скобках:

do{код на Си /* выполнить этот код один раз затем, если выражение есть "истина" - т.е. результат его вычисления не ноль - опять выполнить код с начала, и так до тех пор пока выражение истина */ } while (выражение); Циклы for(;;) и while() часто используют вот так: while(1); for (;;); /* Так написанные эти циклы означают: МК выполнять эту строчку пока есть питание, нет сброса и нет прерывания. Когда возникает прерывание, программа переходит на обработчик прерывания и (если в обработчике нет перехода в другое место программы) по завершении кода обработчика опять возвращается в этот цикл. */ while(1){ код программы }; for (;;){ код программы };     4.for(;;){}; - этот цикл позволяет выполнить часть программы нужное число раз:  
   

char i; /* объявление переменной для for это обычная переменная Си и следовательно может иметь любое допустимое имя по вашему желанию и тип */

for (i=5; i<20; i+=4) {
код на Си /* Вначале будет определено "истинно" или "ложно" контрольное выражение i<20. Так как переменной i присвоено значение 5 то контрольное выражение "истинно" и код цикла for будет первый раз выполнен для i=5, затем по выражению i+=4, i станет 9, теперь снова будет проверена истинность (справедливость, выполнение) контрольного выражение i<20 и так как 9<20 код цикла for будет выполнен еще раз но для i=9. Так будет происходить до тех пор пока результат вычисления контрольного выражения даёт "истинно". Когда результат станет "ложно" - программа выйдет из цикла for не исполняя код. */
};

i = 5 это начальное выражение, то что в начале будет в переменной i. Число 5 просто для примера, может быть таким, как позволяет объявление типа переменной i, в нашем случае это char в большинстве компиляторов по-умолчанию это без знаковый символьный тип - он может хранить числа от 0 до 255

i < 20 - контрольное выражение. Может быть с разными операторами отношения, важно лишь чтобы по ходу цикла оно становилось когда-то "ложью" - иначе цикл "зациклится" т.е. никогда не кончится.

i += 4 - это счетчик или изменение переменной цикла. Обычно это i++ т.е. к переменной добавляется 1 каждый "прогон" цикла. Но опять же может быть таким, какое вам требуется.

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

Контрольное выражение - определяет до каких пор будет выполнятся цикл.

Счетчик - показывает как изменяется начальное выражение перед каждым выполнением нового цикла.

Выражение - может быть не просто переменная, а функция других переменных, например:

i =(7 + i*4) или i = (функция других переменных).

 

5. switch (){}; - оператор множественного выбора, позволяет сделать выбор из нескольких вариантов.

Выражение, следующее за ключевым словом switch в круглых скобках, может быть любым выражением, допустимыми в языке СИ, значение которого должно быть целым. Значение этого выражения является ключевым для выбора из нескольких вариантов. Тело оператора switch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным-выражением. Все константные выражения в операторе switch должны быть уникальны. Кроме операторов, помеченных ключевым словом case, может быть, но обязательно один, фрагмент помеченный ключевым словом default. Список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.

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

- вычисляется выражение в круглых скобках;

- вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;

- если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словом case;

- если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

Все операторы, между начальным оператором и концом тела, выполняются вне зависимости от ключевых слов, если только какой-то из операторов не передаст управления из тела оператора switch. Таким образом, программист должен сам позаботится о выходе из case, если это необходимо. Чаще всего для этого используется оператор break.

 

switch (выражение) {

case 5: код на Си
/* этот код будет выполняться если результат вычисления выражения равен числу 5 на этом работа оператора switch закончится */
break;

case -32: код на Си
/* этот код будет выполняться если результат вычисления выражения равен отрицательномц числу -32. На этом работа оператора switch закончится */
break;

case 'G': код на Си
/* этот код будет выполняться если результат вычисления выражения равен числу соответствующему символу G в таблице ASCII.На этом работа оператора switch закончится */
break;

default: код на Си
/* этот код будет выполняться если результат вычисления выражения не равен ни 5 ни -32 ни 'G', а так же после выполнения кода не
имеющего в конце break;

На этом работа оператора switch закончится */
};

/* switch закончен - выполняется дальнейший код программы */

case - может быть столько сколько требуется, чтобы программа работала быстрее наиболее вероятные варианты следует располагать выше.

default - не обязателен. Его можно расположить и не в конце.

break; - если его не использовать то найдя нужный вариант программа будет выполнять и следующие ниже условия case.

6. goto - оператор безусловного (немедленного) перехода.

  Оператор goto передает управление на оператор, помеченный меткой имя-метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя-метки не может быть использовано для разных операторов программы. Имя-метки - это идентификатор.   какой-то код нашей программы на Си... mesto_5:/* сюда мы попадем после выполнения строки программы goto mesto_5 */ код будет выполнятся после goto mesto_5; ... какой-то код нашей программы на Си... mesto_1:/* сюда мы попадем после выполнения строки программы goto mesto_1 */ код будет выполнятся после goto mesto_1; ... какой-то код нашей программы на Си... goto mesto_1;/* перейти в то место программы где в начале строки написано mesto_1: */ ... какой-то код нашей программы на Си... goto mesto_5;/* перейти в то место программы где в начале строки написано mesto_5: */ ... какой-то код нашей программы на Си.  


Поделиться:


Последнее изменение этой страницы: 2016-12-14; просмотров: 442; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.206.212 (0.012 с.)