Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Основы технологии разработки программного обеспечения



Структура программы на языке Си

 

#include <stdio.h> //подключение стандартного заголовочного файла

#include “my_lib.h” //подключение локального заголовочного файла

#define a 500 // - это команда препроцессора

 

int global_i = 0xA9; //формат записи 16тиричных чисел

float Global_i = 0.635;

 

/* ВАЖНО!

 

Синтаксис языка Си чувствителен к регистру букв,

т.е. а и А – две разные переменные!

*/

 

int Func1(void)

{

       int local_i;

       return local_i;

};

 

int main(void) // по сути main обычная функция

{

int fahr, celsius;

int lower, upper, step;

lower = 0; /* нижняя граница таблицы температур */ ,

upper = 300; /* верхняя граница */

step = 20; /* шаг */

fahr = lower;

while (fahr <= upper) {

Celsius = 5 * (fahr-32) / 9;

printf ("%d\t%d\n", fahr, celsius);

fahr = fahr + step;

};

return 0; // ExitCode. 0 – все хорошо, 1 – ошибка общего вида

}

 


Компиляция программы

 

Исходный текст > Работа препроцессор > Преобразованный исходный текст > Работа компилятора > Объектный файл (машинные коды) > Работа линковщика > Исполняемый файл (устанавливаются адреса вызова библиотечных процедур)

 

Директивы препроцессора

 

#define #include - препроцессорными директивами

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

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

Наиболее широкое распространение среди лексических препроцессоров получил препроцессор языка Си, используемый в языках программирования Си и его потомка, C++. Этот препроцессор обспечивает использование стандартного набора возможностей:

Замена триграфов ?=, ??(, ??) символами #,[,]

Замена комментариев пустыми строками

Включение файла — #include

Макро-подстановки — #define

Условная компиляция — #if, #ifdef, #ifndef, #else, #endif

 

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

 

Присоединение файла

 

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

 

Макросы

 

#define - Макросы в языке Си преимущественно используются для определения небольших фрагментов кода. Во время обработки кода препроцессором, каждый макрос заменяется соответствующим ему определением. Если макрос имеет параметры, то они указываются в теле макроса; таким образом, макросы языка Си могут походить на Си-функции. Распространенная причина использования — избежание накладных расходов при вызове функции в простейших случаях, когда небольшого кода, вызываемого функцией, достаточно для ощутимого снижения производительности.

 

Условная компиляция

 

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

 

В общем случае, программисту необходимо использовать конструкцию наподобие этой:

#ifndef FOO_H

#define FOO_H

...(код заголовочного файла)...

#endif

 

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

 

#pragma once - для цели исключения двойного подключения файлов также существует эта нестандартная директива. Стандартом не оговорено как конкретно препроцессор должен обрабатывать эту директиву.

 

Курьёз с ANSI-директивой «#pragma». Согласно спецификации языка компиляторам предоставлена полная свобода при обработке этой конструкции. До версии 1.17 компилятор GCC при нахождении в исходном коде этой директивы пытался запустить Emacs с игрой «Ханойские башни»

 

Типы переменных

 

int - Знаковое целое

float – числа с плавающей точкой.

 

Тип int означает, что значения перечисленных переменных есть целые,

в отличие от него тип float указывает на значения с плавающей точкой,

т. е. на числа, которые могут иметь дробную часть.

Тип int имеет размер наиболее подходящий для обработки в среде исполнения, но не менее 16 бит.

Числа типа float обычно представляются 32-разрядными словами, имеющими по крайней мере 6 десятичных значащих цифр (лежат приблизительно в диапазоне от10^-8до 10^38).

 

Помимо int и float в Си имеется еще несколько базовых типов для

данных, это:

char - символ - единичный байт;

short - короткое целое;

long - длинное целое;

double - с плавающей точкой с двойной точностью.

 

Для того, чтобы не задумываться над фактической длинной типов рекомендуется пользоваться библиотекой inttype.h, определяющей целочисленные типы фиксированной длины: intN_t, uintN_t

Статические массивы объявляются следующим образом:

int i_array[10];

Ссылки и указатели:

int *p; - указатель на инт

int x;

p = &x;

*p=3;

x = 3;

 

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

 

Математические операторы

 

Агебраические

I++ ó I = I + 1;

I-- ó I = I – 1;

I @= B ó I = I @ B; @ - любая операция – (+ - * / % << >> & ~)

 

 

Логические (применяются в логических выражениях, например в if)

!! – или

&& - и

== - равенство

!= - неравенство

 

Битовые

! – или

& - и

^ - исключающее или

<< - сдвиг влево

>> - сдвиг вправо

~ - инверсия

0x01 & 0x01 = 0x01

0x00 & 0x01 = 0x00

 

0x01 ! 0x01 = 0x01

0x00 ! 0x01 = 0x01


Операторы цикла

 

while (<условие>){

}

 

 

for (<начальное значение fahr = 0>; <условие «пока» fahr <= 300>; <выражение изменения переменной цикла fahr = fahr + 20>)

       {

       }

Инструкция for описывает цикл, который является обобщением цикла while. Если вы сравните его с ранее написанным while, то вам станет ясно, как он работает. Внутри скобок имеются три выражения, разделяемые точкой с запятой. Первое выражение - инициализация

fahr = 0

выполняется один раз перед тем, как войти в цикл. Второе – проверка условия продолжения цикла

fahr <= 300

Условие вычисляется, и если оно истинно, выполняется тело цикла (в нашем случае это одно обращение к printf). Затем осуществляется приращение шага:

fahr = fahr + 20

и условие вычисляется снова. Цикл заканчивается, когда условие становится ложным

 

Условный оператор

if (<условие<) {

       <операторы>;

};

else {

       <операторы>;

}

Оператор выбора

switch (<переменная>) {

case <значение 1>:  <операторы> break;

case <значение 2>:  <операторы> break;

case <значение 3>:  <операторы> break;

default: <> break;}


Поделиться:



Последнее изменение этой страницы: 2019-05-08; Просмотров: 217; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.037 с.)
Главная | Случайная страница | Обратная связь