Выражения и операции

Выражение в программировании служит для определения действий, которые в математике обычно описываются формулами.

Выражение – это последовательность операндов, знаков операций и круглых скобок, которая задаёт вычислительный процесс получения результата определённого типа.

Операндами выражения могут быть переменные, константы, вызовы функций и выражения, к которым применяются операции. Можно считать, что при выполнении программы результат вычисления выражения заменяет само выражение. Например, выражение 10 - (x + y) заменится значением 7, если xравно1,а yравно 2.

Вызов функции представляет собой указание имени вызываемой функции, за которым в круглых скобках указывается аргумент:

a * sin(x + k) + exp(y).

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

· арифметические операции;

· операция присваивания;

· операции сравнения (отношения);

· логические операции;

· поразрядные (побитовые) операции.

Арифметические операции

+, -, *, / – знаки бинарных операций сложения, вычитания, умножения и деления соответственно. Если в операции деления оба операнда целые числа, то результат операции тоже целое число. Следовательно, имеется две разновидности операции деления – целочисленное деление (результат – целое число) и деление без остатка (результат – вещественное число). Например: 5 / 2 = 2, 5.0 / 2 = 2.5.

Для целых чисел определена операция %деление по модулю (нахождение остатка от деления), например:

5 % 2 = 1, 2 % 5 = 2.

Примером унарной операции являются операции изменения знака числа:

-x,+a,-5.61.

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

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

Операция присваивания

Операция присваивания (=) относится к бинарным операциям и имеет следующий вид:

левый_операнд = правый_операнд

В качестве левого операнда операции (=) могут использоваться только переменные. Выражения x + 1 = 3 или 3 = x – недопустимы. Правым операндом операции могут быть выражения.

В результате выполнения операции (=) значение правого операнда присваивается левому операнду, например: x = y + 1. Результатом выполнения операции является присвоенное значение, поэтому возможно множественное присваивание:

x = y = z = a + 1

переменные z, y, x примут значение a + 1, если все они одного типа.

Если тип правого операнда не совпадает с типом левого операнда, то выполняется преобразование типа правого операнда к типу левого операнда. Поэтому результат вычисления выражения imax=4.0 + 3.5,где imax типа int, будет равен 7 вместо ожидаемого значения 7.5, так как компилятор преобразует число 7.5 в целое, отбрасывая дробную часть.

Следует отметить, что часто переменная, являющаяся левым операндом операции присваивания, может использоваться в выражении, находящемся в правой части, например: a = a / 3 или b = b * 2

Вычисление значений этих выражений приводит к двукратному определению адресов переменных a и b – для нахождения исходных значений и для занесения полученных результатов. Эту избыточность можно ликвидировать, записав

a/=3, b*=2

Операции присваивания вида +=, -=, *=, /=, %= называются составными операциями присваивания.

Операции сравнения (отношения)

В языке С++ применяются следующие операции сравнения:

== – (равно); > – (больше); < – (меньше); >= – (больше или равно); <= – (меньше или равно); != – (не равно).

В качестве операндов операций сравнения могут быть использованы выражения, значения которых перед выполнением операции вычисляются и их результаты сравниваются с помощью операций сравнения. Результатом операций сравнения является значение true(истина), если сравнение выполняется, и false (ложь) – если не выполняется. При этом следует отметить, чтовС++любое ненулевое значение соответствует истине, а нулевое значение – лжи. Например, результат сравнения x == 1 будет true, если значение переменной x равно единице, иначе – false.

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

Иногда условные выражения требуют одновременной проверки нескольких условий. Например, выражение 0 < x < 5 содержит сразу два условия 0 < xи x < 5. В программировании для записи таких выражений используются логические операции. В языке С++ к логическим операциям относятся:

&&– логическое И;

|| – логическое ИЛИ;

! – логическое НЕ (отрицание).

С использованием логических операций выражение 0 < x < 5в языке С++ следует записать как (x > 0) && (x < 5).

Операции (&&) и (||)являются бинарными и поэтому при их применении надо указывать два операнда, а операция (!) –унарная операция, т.е. нужен всего один операнд.

Результат выполнения логических операций зависит от значений операндов, с которыми они используются. Так, операция (&&) возвращает значение true,когда истинны (не равны нулю) оба его операнда. Например, значением выражения (x > 0) && (x < 5)будет trueтолько в том случае, если значение переменной xбудет больше 0, но меньше 5. Операция (||)возвращает значение false только в том случае, если ложны (равны нулю) оба её операнда. Операция (!) просто инвертирует значение своего операнда с false на true и наоборот.

Таблица свойств логических операций

v1 v2 !v2 v1 && v2 v1 || v2
false false true false false
false true false false true
true false   false true
true true true true

Побитовые (поразрядные) операции

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

Побитовые операции могут выполнять действия только над целочисленными значениями. Их нельзя применять к данным типа float и double. В отличие от логических операций с их помощью сравниваются не два числа целиком, а отдельные их биты, причём каждый бит рассматривается независимо от других битов. К таким операциям в языке С++ относятся следующие операции:

& – поразрядное И;

| – поразрядное ИЛИ;

~ – поразрядное НЕ (инверсия);

^ – поразрядное "исключающее ИЛИ";

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

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

 

 

Таблица свойств побитовых операций

x y ~y x & y x | y x^y

Рассмотрим примеры выполнения побитовых операций:

10101 10101 10101

& | ^

11001 11001 11001

-------- --------- --------

10001 11101 01100

Операции инкремента и декремента

В языке С++ предусмотрены операция (++) и операция (--) соответственно для увеличения и уменьшения на единицу значения операнда (унарные операции инкремента и декремента). Их можно указывать перед операндом (префиксная форма записи) и после операнда (постфиксная форма записи). В первом случае (++x, --x) значение операнда x изменяется перед его использованием в выражении, а во втором (x++, x--) – после его использования. Например, запись sum = x + y++означает "сложить x и y и увеличить y на единицу" а запись

sum = x + ++y –"увеличить y на единицу, сложить x и y и присвоить результат sum". Так, если x = 1, а y = 2, то в первом случае sum = 3, а во втором – sum = 4.

Условная операция (?)

ЯзыкC++ имеет очень мощную условную операцию (операцию условия), которая обозначается символом вопроса (?). Условная операция является трёхоперандной (тернарной) и имеет следующий вид:

операнд_1 ? операнд_2 : операнд_3

где операнд_1, операнд_2 и операнд_3 – это выражения.

Результатом выполнения операции (?) является значение операнда_2 или операнда_3 в зависимости от истинности операнда_1. Если значением операнда_1 является true, результатом операции является значение операнда_2, если falseоперанда_3. Например, результатом выполнения условной операции

(a >0) ? x : 0

будет значение x, если a > 0 и нулевое значение – в противном случае.

Операция запятая

В С++ определена специальная операция запятая (,), задающая последовательность вычисления выражений, например: (i = 1, j = 2, k =3).

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

a = (x = 5, y = 6, z = 3) равен 3.

Операция sizeof

Операция sizeof позволяет определить, сколько памяти занимает то или иное значение. Например, sizeof(int) определяет число байтов, отводимое под переменные типа int, а sizeof(b)– число байтов, занимаемое переменной b.

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

Приоритеты операций

Порядок выполнения операций при вычислении значения выражения определяется расположением знаков операций, круглых скобок и приоритетом операций. Операции с наивысшим приоритетом выполняются в первую очередь. Если в выражении содержится несколько операций одного приоритета на одном и том же уровне, то их обработка производится в соответствии с порядком выполнения – справа налево или слева направо. Если необходимо изменить порядок выполнения операций в выражении, то следует использовать круглые скобки, например (x + y) * z.

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

В приведенной ниже таблице операции языка C++ приведены в порядке убывания приоритета. Операции с разными приоритетами разделены чертой.

 

 

Таблица приоритетов операций

Знаки операций Названия операций Порядок выполнения
( ) ++ -- повышение приоритета постфиксный инкремент постфиксный декремент слева направо  
sizeof ++ -- ~ ! - + (тип)выражение и тип (выражение) размер операнда в байтах префиксный инкремент префиксный декремент поразрядное НЕ логическое НЕ унарные минус, плюс преобразование типа     справаналево
* / % умножение деление остаток от деления целых   слева направо
+ - сложение вычитание слева направо
<< >> сдвиг влево сдвиг вправо слева направо
< <= > >= меньше меньше или равно больше больше или равно   слева направо
== != равно не равно слева направо
& поразрядноеИ слева направо
^ поразрядное исключающее ИЛИ слева направо
| поразрядное ИЛИ слева направо
&& логическое И слева направо
|| логическое ИЛИ слева направо
? : условная справа налево
= *=, /=, %= +=, -= <<=, >>= &=, |=, ^=   присваивание (простое и составное)   справа налево
, операция запятая слева направо

 

Приведение (преобразование) типа

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

Автоматически производятся лишь преобразования, которые преобразуют операнды с меньшим диапазоном значений в операнды с большим диапазоном значений, поскольку это происходит без какой-либо потери информации. Например, если в выражении ival + fval переменная ivalтипа int, а переменная fval – типа float, то при выполнении операции (+) значение переменной ival будет приведено к типу float.

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

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

(тип) выражение

тип (выражение)

Операндом операции приведения типа является преобразуемое выражение. Приоритет операции приведения типа такой же, как и у других унарных операций. Например: (long double)5; (int)f; (double)a/2.

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

(int)x + b * c

(int)( x + b * c )

В первом случае преобразование относится к переменной x, во втором – ко всему выражению x+ b * c.








Дата добавления: 2016-04-22; просмотров: 3781;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.021 сек.