русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Препроцессор языка Си и директивы условной компиляции


Дата добавления: 2013-12-23; просмотров: 1357; Нарушение авторских прав


Оператор передачи управления (оператор-переключатель) switch

 

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

Общая синтаксическая форма записи:

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

{

case константа_1: оператор(ы) ;

case константа_2: оператор(ы) ;

default: операторы (ы) ;

{

Правило выполнения: Сначала вычисляется значение выражения. Это значение сравнивается с константами во всех вариантах case. Управление передается оператору или группе операторов, константа которого совпадает со значением выражения. Если ни одна из констант не совпала со значением выражения, то выполняются операторы, связанные с меткой default. Если же конструкция default отсутствует, то ни один оператор не будет выполнен, а управление передастся следующему оператору программы.

Примечание: default – не обязательно последний; default – не обязательная конструкция.

Если будет выполнятся какой-либо оператор, то будут выполнятся операторы всех последующих вариантов (case и default) до тех пор, пока не встретится оператор break.

Область действия меток case – тело оператора switch. Никакие две константы не могут иметь одинакового значения.

Константы могут иметь только типы int, char, enum. Объект сравнения с меткой может быть константой, переменной, указателем функции, выражением упомянутых типов.

Меток может быть несколько, например:

case ‘1’: case ‘3’: case ‘5’: оператор;

case ‘2’: case ‘4’: case ‘6’: оператор;

 

Пример 3.7: Использования оператора switch.

# include <math.h> // Подключение математической библиотеки

# include <stdio.h>

void main (void)

{

float x;

puts(“Введите значение x: “);



scanf (“%f”, &x);

puts (“Введите первую букву имени функции: \n”

“S- Sin \n”

“C-Cos \n”

“A-Atan ”);

flushall () ;

switch (getchar( ) )

{

case ‘S’ : case’s’ :

printf (“Синус X= %f \n”, sin(x) ) ; break;

case ‘C’: case ‘c‘:

printf (“Косинус X= %f \n”, cos(x) ); break;

case ‘A’: case’a’:

printf(“Арктангенс X= %f \n”, atan(x)); break;

default;

puts (“Ошибка \a\n”);

}

}

Замечание: Одна из распространенных ошибок состоит в том, что часто забывают разделять альтернативные операторы в теле переключателя операторами break.

 

3.6. Оператор разрыва break

 

Оператор разрыва break прерывает выполнение операторов for, while, do…while и switch. Он может присутствовать только в теле этих операторов. Появление этого оператора в другом месте программы рассматривается как ошибка.

Синтаксис:

break;

Действие:

Если оператор разрыва находится внутри вложенных операторов, то прерывается только непосредственно охватывающий его оператор. Если же требуется прерывание более чем одного уровня вложенности, то следует использовать операторы возврата return и перехода go to.

Замечание: С помощью оператора go to нельзя передать управление на конструкции case и default в теле переключателя.

Пример 3.8. Использование оператора break.

# include <stdio.h>

// Применение ключа switch c использованием оператора break.

main( )

{

char ch;

printf(“Введите заглавную букву русского алфавита”);

ch = getchar();

if (ch >= ’А’ && ch <= ’Я’)

switch(ch)

{

case ‘A’:

printf(“Алексеев \n”);

case ‘Б’:

printf(“Булгаков \n”);

case ‘В’:

printf(“ Волошин \n”);

break;

case ‘Г’:

printf(“Гоголь \n”);

break;

default;

printf(“Достоевский, Зощенко и др. \n);

break;

}

else

printf(“Надо было ввести заглавную букву \n”);

}

 

 

3.7. Операция условия ?:

Операция условие – единственная операция языка Си, имеющая три операнда.

Синтаксическая форма:

Выражение_1? выражение_2: выражение_3;

Правило выполнения:

Если выражение_1 истинно (т.е. ! = 0), то результатом операции является значение выражения_2, в противном случае – значение выражения_3.

Примеры использования:

1. Нахождения max из двух чисел:

max = (a>b)? a: b;

2. Нахождение абсолютной величины числа x:

abs = (x >0)? x: -x;

 

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

 

Таблица 3.1

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

 

Определение Назначение
#define Определение макроса
#undef Отмена определения макроса
#include Включение объекта-заголовка
#if Компиляция, если выражение истинно
#ifdef Компиляция, если макрос определен
#ifndef Компиляция, если макрос не определен
#else Компиляция, если выражение в if ложно
#elif Составная директива else/if
#endif Окончание группы компиляции по условию
#line Замена новым именем строки или имени исходного файла
#error Формирование ошибок трансляции
#pragma Действие определяется реализацией
# Null- директива

 

Как видно из табл.3.1, все директивы начинаются с символа #.

Директива#define вводит макроопределение или макрос. Общая форма директивы следующая:

# define ИМЯ_МАКРОСА последовательность_символов

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

Можно отменить определение макроса директивой # undef:

# undef имя_макроса

Данная строка удаляет любую ранее введенную строку замещения. Определение макроса теряется и имя_макроса становится неопределенным.

К примеру можно определить МАХ как величину 100:

#define MAX 100

Это значение будет подставляться каждый раз вместо макроса МАХ в исходном файле, Можно также использовать макрос вместо строковой константы:

#define NAME “ Turbo C++”

Если последовательность символов в директиве не помещается в одной строке, то можно поставить в конце строки \ и продолжить последовательность на другой строке. Среди программистов принято соглашение, что для имен макросов используются прописные буквы, так как их легко находить в программе. Также все директивы #define лучше помещать в начало программы.

Директива #define имеет еще одну важную особенность: макрос может иметь аргументы. Каждый раз, когда происходит замена, аргументы заменяются на те, которые встречаются в программе.

Пример: #define MIN(a, b) ((9a)<(b)) ? (a) : (b)

…………………………………………

printf(“Минимум из x и y “ % d, MIN(x ,y));

printf(“Минимум из a и b “ % d, MIN(n ,m));

…………………………………………………

Когда программа будет компилироваться, в выражение, определенное MIN (a, b) будут подставлены соответственно x и y или m и n. Аргументы a и b заключены в круглые скобки, так как вместо них может подставляться некоторое выражение, а не просто идентификатор.

Например, printf(“Минимум “ % d, MIN(x*x, x));

Директива # errorимеет вид:

# error сообщение_об_ошибке

Эта программа прекращает компиляцию программы и выдает сообщение об ошибке.

Директивы условной компиляции. К данным директивам относятся:

#if, #else, #elif, #endif.

Данные директивы производят выборочную компиляцию программы. Если выражение, следующее за #if, истинно, то коды, заключенные между #if и #endif, будут компилироваться. В противном случае они при компиляции будут пропущены. Выражение, следующее за #if, проверяется во время компиляции, поэтому оно может содержать только константы и макросы, которые прежде определены. Переменные здесь не могут использоваться.

Директива #else используется так же, как и else в языке Си.

Пример 3.9: Использование условной компиляции.

# include <stdio.h>

# define MAX 100

main(void)

{

# if MAX>99

printf(“ MAX равно %d \n”, MAX);

# endif

return 0;

}

Директива #elif используется для организации вложенной условной компиляции. Форма использования ее следующая:

#if <выражение>

последовательность операторов

#elif <выражение 1>

последовательность операторов

#elif <выражение 2>

последовательность операторов

…………………………………..

# endif

Другой метод условной компиляции состоит в использовании директив #ifdef и #ifndef. Основная форма использования этих директив следующая:

 

#ifdef ИМЯ_МАКРОСА

последовательность операторов

# endif

 

и соответственно

 

#ifndef ИМЯ_МАКРОСА

последовательность операторов

# endif

Если макрос определен, то при использовании # ifdef компилируется соответствующая последовательность до операторов # endif. Если же макрос не определен или был отменен директивой #undef, то соответствующая последовательность операторов игнорируется компилятором.

Директива #ifndef действует противоположным образом. О других директивах более подробно можно прочитать в [2].

 

 



<== предыдущая лекция | следующая лекция ==>
Оператор передачи управления go to | Объявление и инициализация массивов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.