Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Первичные (унарные) операции




. Доступ к члену объект. член

Слева

направо

-> Доступ по указателю указатель -> член
[ ] Индексирование переменная [ выражение ]
() Вызов функции ID_ функции (список)

Унарные операции

++ Постфиксный инкремент lvalue ++

Справа

налево

-- Постфиксный декремент lvalue --
sizeof Размер объекта (типа) sizeof(ID или тип)
++ Префиксный инкремент ++ lvalue
-- Префиксный декремент -- lvalue
~ Побитовое НЕ ~ выражение
! Логическое НЕ ! выражение
– (+) Унарный минус (плюс) – (+) выражение
* Разадресация * выражение
& Адрес & выражение
() Приведение типа (тип) выражение

Бинарные и тернарная операции

* Умножение выражение * выражение

Слева

направо

/ Деление выражение / выражение
% Получение остатка выражение % выражение
+ Сложение выражение + выражение
Вычитание выражениевыражение
<< Сдвиг влево выражение << выражение
>> Сдвиг вправо выражение >> выражение
< Меньше выражение < выражение
<= Меньше или равно выражение <= выражение
> Больше выражение > выражение
>= Больше или равно выражение >= выражение
== Равно выражение == выражение
!= Не равно выражение!= выражение
& Побитовое И выражение & выражение
^ Побитовое исключ. ИЛИ выражение ^ выражение

 


 

Опера­ция Краткое описание Использование Порядок выполнения
| Побитовое ИЛИ выражение | выражение

Слева направо

&& Логическое И выражение && выражение
|| Логическое ИЛИ выражение || выражение
?: Условная операция (тернарная) выражение? выражение: выражение

 

 

Справа

налево

= Присваивание lvalue = выражение
*= Умножение с присваиванием lvalue *= выражение
/= Деление с присваиванием lvalue /= выражение
%= Остаток от деления с присваиванием lvalue %= выражение
+= Сложение с присваиванием lvalue += выражение
- = Вычитание с присваиванием lvalue -= выражение
<<= Сдвиг влево с присваиванием lvalue <<= выражение
>>= Сдвиг вправо с присваиванием lvalue >>= выражение
&= Поразрядное И с присваиванием lvalue &= выражение
|= Поразрядное ИЛИ с присваиванием lvalue |= выражение
^= Поразрядное ИСКЛЮЧАЮ­ЩЕЕ ИЛИ с присваиванием lvalue ^= выражение
, Последовательное вычисление выражение, выражение Слева направо

 


 


Возможности препроцессора

 

Препроцессор, как мы уже знаем, это программа предварительной обра­­ботки исходного текста программы перед этапом компиляции. Чаще всего препроцессор автоматически вызывается на этапе компи­ля­ции, если в исходном тексте обнаружена хотя бы одна его директива.

Признаком директивы препроцессора является символ #. При необходимости продолжения директивы в следующей строке текущую строку должен завершать символ '\'.

Возможности препроцессора языка Cи:

– лексемное замещение идентификаторов;

– макрозамещение;

– включение файлов исходного текста;

– условная компиляция;

– изменение нумерации строк и текущего имени файла.

 

Директивы лексемного замещения идентификаторов

Директива определения значения идентификатора (ID):

#define ID строка

В результате каждое вхождение в исходный текст элемента ID заменяется на значение элемента строка:

#define L_bufs 2048

#define binary int

#define WAIT fflush(stdin); getch()

    #define BEEP sound(800);\

                    delay(100);\

                    nosound()

Лексемное замещение весьма удобно для сокращения записи повторяю­щихся фрагментов теста и определения символических констант:

    #define YES 1

#define NO 2

#define ESC 27

#define Enter 30

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

     if (x==ESC) break;

BEEP;

     return(YES);

Директива отмены

#undef ID

Далее по исходному тексту можно назначить новое значение такого идентификатора.


 

Макрозамещение

Макрозамещение – обобщение лексемного замещения посредством параметризации строки директивы define в виде:

         #define ID(параметр 1,...) строка

между элементом ID и открывающей скобкой пробелы не допускаются.

Такой вариант директивы define иногда называют макроопределением. Элемент строка обычно содержит параметры, которые препроцессором будут заменены на фактические аргументы так называемой макрокоманды, записываемой в формате

ID(аргумент 1,...)

Пример макроопределения и макрокоманд:

#define P(X) printf ("\n%s",X)

   ...

char *x;

P(x);                   // Использование макроопределения P(X)

P(" НАЧАЛО ОПТИМИЗАЦИИ");

printf("\n%s",x);      // Эквивалентные операторы

printf("\n%s"," НАЧАЛО ОПТИМИЗАЦИИ");

В строке макроопределений идентификаторы параметров сложных выра­же­ний рекомендуется заключать в круглые скобки:

#define МАХ(A,B) ((A)>(B)? (A):(B))

#define ABS(X) ((X)<0? –(X):(X))

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

#define BP(X) X*X

             ...

int x,y,z;

x=BP(y+z);              «x=y+z*y+z;     «x=y+(z*y)+z;

Очевидно, что ошибки будут и при следующих вариантах:

#define BP(X) (X*X)

#define BP(X) (X)*(X)

Безопасный вариант:

#define BP(X) ((X)*(X))

Иногда источником ошибок может быть символ «точка с запятой» в конце строки макроопределения:

#define BP(X) ((X)*(X));

   ...       


int x,y,z;

x=BP(z)–BP(y); «y=((z)*(z));      –((y)*(y));

Макроопределение отменяется директивой undef.

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

Макрокоманда внешне синтаксически эквивалентна операции вызова функции, но смысл их различен. Функция в программе имеется в одном экземпляре, но на ее вызов тратится время для подготовки параметров и передачи управления. Каждая макрокоманда замещается соответствующей частью макроопределения, но потерь на передачу управления нет.





Поделиться с друзьями:


Дата добавления: 2018-10-14; Мы поможем в написании ваших работ!; просмотров: 323 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Неосмысленная жизнь не стоит того, чтобы жить. © Сократ
==> читать все изречения...

2393 - | 2099 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.