Операции, выражения и операторы. 


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



ЗНАЕТЕ ЛИ ВЫ?

Операции, выражения и операторы.



 

Основными операциями языка Си считаются +, *, -, /, а также оператор присваивания =. Как и в языке Паскаль, в Си нет возведения в степень. Основные операции выполняются в Си также как и в Паскаль, но имеют несколько дополнений. Так, знак "-" может использоваться как унарная операция, изменяющая знак переменной на противоположный. Особое использование отличает операцию деления. Она может применяться как к целым, так и к вещественным числам. Если результат операции деления должен быть присвоен целочисленной переменной, то дробная часть просто отбрасывается. Это действие называется усечением. Если деление применяется к операндам разного типа, то целочисленное значение преобразуется к виду с плавающей точкой.

Среди наиболее распространенных операций Си можно выделить:

1) sizeof - она возвращает размер операнда, выраженный в байтах. Операндом может быть конкретная данная или тип данных. При использовании последнего, оно записывается в скобках.

2) деление по модулю (%). Используется в целочисленной арифметике. Ее аналогом в Паскаль является функция mod.

3) инкремент (++). Выполняет простое действие: увеличивает значение операнд на 1. Эта операция может быть записана в префиксной форме, когда символ "++" предшествует переменной, и в постфиксной форме, когда "++" следует за переменной. Эти формы различаются последовательностью приращения значения операнда.

Пример:

a++;

++a;

b=a++;

b=++a;

Первые два оператора не имеют различий. В третьем примере сначала значение переменной a будет присвоено переменной b, а затем увеличено на 1. В четвертом примере сначала значение переменной a увеличится, а затем присвоится.

4) декремент (--). Существует в префиксной и постфиксной формах. Результат его действия - уменьшение значения оператора на 1.

Операции "++" и "--" имеют очень высокий приоритет исполнения. Выше только исполнение действий в скобках.

В языке Си существует несколько форм оператора присваивания:

Записи

Действия

+=

к переменной левой части прибавляется величина правой части

-=

вычитается величина правой части из значения переменной левой части

*=

умножается значение переменной левой части на величину правой части

/=

делится значение переменной левой части на величину правой части

%=

присваивается переменной левой части остаток от деления левой части на правую

 

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

1) когда в выражении встречаются типы char и short, они автоматически преобразуются в int. Тип float преобразуется в double. Поскольку такие действия преобразуют к типу, обеспечивающему больший размер данных, то они называются повышением типа.

2) если операция выполняется над данными разных типов, то обе величины преобразуются к высшему из этих типов.

3) последовательность типов, упорядоченных по принципу от высшего к низшему выглядит так: long double, double, float, unsigned long, long, unsigned int, int.

4) в операторе присваивания окончательный результат вычислений преобразуется к типу переменной, которой присваивается вычисленный результат.

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

Пример:

b=(int)3.3+4;

 

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

 

Одной из самых распространенных директив является директива #define. Эта директива используется для определения назначения указанных в ней идентификаторов. Использование этой директивы внешне похоже на работу с константами. Каждая строка #define состоит из трех частей:

1) сама директива;

2) выбранная вами аббревиатура или идентификатор, который принято называть макрос;

3) подставляемые значения или список замены или тело.

Процесс начинающийся макросом и завершающийся процессом замены, называется макрорасширением.

Пример:

#include

#define TWO 2

#define FOUR TWO*TWO

#define PX printf ("x - это %d, \n", x)

int main (void)

{

int x = TWO;

PX;

x = FOUR;

PX;

}

При исполнении приведенной программы на этапе работы препроцессора происходят следующие замены: строка int x = TWO заменяется на int x = 2; строка PX на printf (…); x = FOUR на x = TWO*TWO, а затем на x = 2*2. На этом процесс макрорасширения заканчивается, т.е. на этапе препроцесса умножение не исполняется, а исполняются только предложенные подстановки.

Результатом работы программы будет вывод двух строк:

x - это 2

x - это 4

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

Пример:

#include

#define PX printf ("Сегодня первой па\

рой - алгоритмизация.\n")

int main (void)

{

PX

}

Если в приведенном примере перед слогом "рой" поставить несколько пробелов, то они будут выведены в результирующей строке. Используя аргументы директивы #define, можно создавать макросы функции, которые выглядят и действуют подобно функциям.

Пример:

#define SQUARE (x) x*x

Эта директива может быть использована в следующих операторах:

int x = 4;

int z;

1) z = SQUARE (2);

2) z = SQUARE (x);

3) z = SQUARE (x+2);

4) z = 100/SQUARE (2);

На этапе препроцесса первая запись будет заменена на z = 2*2; вторая на z = x*x; третья на z = x+2*x+2; четвертая на 100/2*2. Соответственно результатами будут значения: 4, 16, 14, 100.

Если в третьем случае необходимо исполнения действия (x+2)*(x+2), то подставляемое значение в директиве #define должно быть заменено на (x)*(x). При этом в четвертой записи получим z = 100/(2)*(2). Для исполнения этого действия как 100/(2*2) необходимо в директиве #define записать ((x)*(x)).

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

 



Поделиться:


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

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