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


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



ЗНАЕТЕ ЛИ ВЫ?

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



 

Выражения в языке С++ - это последовательность операндов, операций и символов-разделителей. Операнды - это переменные, константы либо другие выражения. Разделителями в С++ являются символы [ ] () { },;:... * = #, каждый из которых выполняет свою функцию. Выражение может состоять из одной или более операций и определять выполнение целого ряда элементарных шагов по преобразованию информации. Компилятор соблюдает строгий порядок интерпретации выражений, называемый правилами предшествования. Этот порядок может быть изменён, если отдельные части выражения заключить в круглые скобки. Элементарная операция по преобразованию информации задаётся знаком операции. По числу операндов участвующих в операции различают две группы операций: унарные (один операнд) и бинарные (два операнда). По типу выполняемой операции различают арифметические, поразрядные, логические, присваивания, операции отношения и др.

 

Основные операции и их приоритет

 

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

 

Язык С++ включает стандартный набор арифметических операций сложения (задаётся знаком +), вычитания (-), умножения(*), деления (/), не требующих особого пояснения. Специфичными для С++ являются операции определения остатка (%), инкремента (++) и декремента (--). Операцию % поясняет следующий пример:

int a = 5, b = 2, c = 0, d;

d = a%b; /* d=1 – остаток от целого деления 5/2 */

d = b%a; /* d=2 */

d = a%c; /* сообщение об ошибке деления на 0 */

 

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

int a = 0, b = 1, c;

c = a++; /* c равно 0, а равно 1 */

c = ++a; /* теперь с=2, а=2 */

c = ++b; /* с=2, b=2 */

 

Форма записи операций ++ и -- сказывается в составных выражениях. Ясно, что нет никакого различия между одиночными выражениями a++; и ++a; b--; и –b;

 

Поразрядные логические операции

 

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

& поразрядное логическое И (AND);

^ поразрядное сложение по модулю 2 (XOR – исключающее или);

| поразрядное логическое ИЛИ (OR);

~ поразрядная инверсия.

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

 

Таблица 8

 

Операнд 1 Операнд 2 AND OR XOR
         
         
         
         

 

 

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

int s = 0x53c9, mask = 0x356c, r_or, r_and, r_xor, r_inv;

r_or = s|mask; /* r_or=0x77ed */

r_and = s&mask; /* r_and=0x1148 */

r_xor = s^mask; /* r_xor=0x66a5 */

r_inv = ~mask; /* r_inv=0xca93 */

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

Например, определение остатка от деления операнда unsigned int на 2, 4, 8, 16 и т. д. требует поразрядной логической операции И делимого соответственно с масками 0х01, 0х03, 0х07, 0х0f, 0x1f и т. д. Другими словами, выделяются младшие биты числа, а остальные биты устанавливаются в 0. Это наиболее быстрый способ выделения остатка.

Пример:

int s = 0x05, mask = 0x01;

r_or = s&mask = 0x05 & 0x01 = 0x01;

Это наиболее быстрый способ выделения остатка.

 

Операции сдвига

 

Язык С++ включает две операции поразрядного сдвига:

<< - сдвиг влево операнда слева от знака операции на число двоичных разрядов справа от знака операции;

>> - сдвиг вправо операнда слева от знака операции на число двоичных разрядов справа от знака операции.

Выдвигаемые биты теряются, а «вдвигаются» нулевые биты.

Сдвиг операндов влево на 1, 2, 3 и более разрядов – наиболее быстрый способ деления на 2, 4, 8,… Например:

half_adr = adr >> 1; /* деление на 2 */

double_adr = adr << 1; /* умножение на 2*/

Часто операции сдвига выполняются при преобразовании чисел или при формировании целого из частей.

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

int var1, shift = 5;

var1 = var1 >> shift;

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 408; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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