Программирование >>  Процедурные приложения 

1 ... 25 26 27 [ 28 ] 29 30 31 ... 150


1111001100110101

результат 11110111 (двоичное)

0xF1 л 0x35

результат 0хС4 (шестнадцатеричное)

0361 л 0065

результат 0304 (восьмеричное)

11110011 л 00110101

результат 11000110 (двоичное)

~0xF1

результат 0xFF0E (шестнадцатеричное)

~0361

результат 0177416 (восьмеричное)

~11110011

результат 11111111 00001100 (двоичное)

В последнем примере результат состоит из двух байтов, так как в процессе операции побитового отрицания осуществляется повышение целочисленности операнда - его тип преобразуется к типу с большей размерностью. Если операнд беззнаковый, то результат получается вычитанием его значения из самого большого числа повышенного типа. Если операнд знаковый, то результат вычисляется посредством приведения операнда повышенного типа к беззнаковому типу, выполнения операции ~ и обратного приведения его к знаковому типу.

Операторы сдвига

Языки C/C++ содержат два оператора сдвига: сдвиг влево (<<) и сдвиг вправо (>>). Первый сдвигает битовое представление целочисленной переменной, указанной слева от оператора, влево на количество битов, указанное справа от оператора. При этом освобождающиеся младшие биты заполняются нулями, а соответствующее количество старших битов теряется.

Сдвиг беззнакового числа на одну позицию влево с заполнением младшего разряда нулем эквивалентен умножению числа на 2, как показано в следующем примере:

unsigned int valuel =.65; valuel <<= 1; cout << valuel;

младший байт: 0100 0001 младший байт: 1000 0010 будет выведено 130

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

unsigned int valuel = 10; младший байт: 0000 1010 valuel >>= 1; младший байт: 0000 0101

printf( %d ,value1); будет выведено 5

Инкрементирование и декрементирование

Операции увеличения или уменьшения значения переменной на 1 столь часто встречаются в программах, что разработчики языка С предусмотрели для этих целей специальные операторы инкрементирования (++) и декрементировант (--). Эти операторы можно применять только к переменным, но не константам.

Так, вместо следующей строки

value1 + 1; можно ввести строку value1++; ИЛИ

++value1;

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

Операторы ++ и - находят широкое применение в цикле for:

sum = 0;

for(1=1; i <= 20; i++) sum = sum + i;



Цикл с декрементом будет выглядеть так:

sum = 0;

for(i = 20; 1 >= 1; i-) sum = sum + i;

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

Например, при постфиксном инкрементировании - i++ - сначала возвращается значение переменной, после чего оно увеличивается на единицу. С другой стороны, оператор префиксного инкрементирования - ++i - указывает, что сначала следует увеличить значение переменной, а затем возвратить его в качестве результата. Рассмотрим примеры. Предположим, имеются следующие переменные:

int i = 3, j, k = 0;

Теперь проанализируем, как изменятся значения переменных в следующих выражениях (предполагается, что они выполняются не последовательно, а по отдельности):

k = i = 4, k = 4

k=i++; i = 4, k = 3

k = --i; i = 2, k = 2

k = i-- ; i = 2, k = 3

i = j = k-; i = 0, j = 0, k = -1 Арифметические операторы

В языках C/C++ вы найдете все стандартные арифметические операторы, в частности операторы сложения (+), вычитания (-), умножения (*), деления (/) и деления по модулю (%). Первые четыре понятны и не требуют разъяснений. Возможно, имеет смысл остановится на операции деления по модулю:

,b=8

,c=0

результат:

результат:

результат:

сообщение об ошибке

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

Оператор присваивания

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

valuel = 8 * (value2 = 5);

В данном случае сначала переменной value2 будет присвоено значение 5, после чего это значение будет умножено на 8 и результат 40 будет записан в переменную value1.

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

valuel = value2 = value3 = 0;

Второй прием часто можно встретить в условных выражениях цикла while, как в следующем примере:

while (( с = getchar()) != EOF) {



Вначале переменной с присваивается значение, возвращаемое функцией getchar (}, после чего осуществляется проверка значения переменной на равенство константе eof. Цикл завершается при обнаружении конца файла. Использование круглых скобок необходимо из-за того, что оператор присваивания имеет меньший приоритет, чем подавляющее большинство других операторов, в частности оператор неравенства. Без круглых скобок данная строка будет воспринята следующим образом:

с = (getchar() != EOF)

То есть переменной с будет присваиваться значение 1 (true) всякий раз, когда функция getchar () возвращает значение, отличное от признака конца файла.

Комбинированные операторы присваивания

Набор операторов присваивания в языках C/C++ значительно богаче, чем в других языках программирования. Всевозможные комбинированные операторы присваивания позволяют предельно сжать программный код. В следующих строках показаны некоторые выражения присваивания, стандартные для большинства языков высокого уровня:

irow index = irow index + irow increment;

ddepth = ddepth - dl fathom;

fcalculate tax = fcalculate tax * 1.07;

fyards = fya.rds / ifeet convert;

Теперь посмотрим, как эти же выражения будут выглядеть в C/C++:

irow index += irow increment;

ddepth -= dl fathom; fcalculate tax *= 1.07;

fyards /= ifeet convert;

Если вы внимательно рассмотрите эти примеры, то легко поймете синтаксис комбинированных операторов присваивания. Когда в левой и правой частях выражения встречается одна и та же переменная, вы можете удалить ссылку на нее из правой части, а соответствующий оператор объединить с оператором присваивания. Комбинированный оператор указывает, что над переменными из левой и правой частей выражения нужно выполнить операцию, указанную перед знаком равенства, а результат вновь присвоить переменной из левой части выражения. Все комбинированные операторы присваивания перечислены в нижней части табл. 5.4, которая приведена в конце главы.

Операторы сравнения и логические операторы

Операторы сравнения предназначены для проверки равенства или неравенства сравниваемых операндов. Все они возвращают true в случае установления истинности выражения и false в противном случае. Ниже показан список операторов сравнения, используемых в языках С и

C++:

Оператор

Выполняемая проверка

Равно (не путать с оператором присваивания)

Не равно

> 1

Больше

< 1

Меньше

Меньше или равно

<= 1

Больше или равно

Логические операторы И (&&),ИЛИ ( ) и НЕ (!)возвращают значение true или false в зависимости от логического отношения между их операндами. Так, оператор && возвращает true, когда истинны (не равны нулю) оба его аргумента. Оператор возвращает false только в том случае, если ложны (равны нулю) оба его аргумента. Оператор ! просто инвертирует значение своего операнда с false на true и наоборот.

Следующий пример программы на языке С демонстрирует применение перечисленных выше операторов сравнения и логических операторов.

/* 86



1 ... 25 26 27 [ 28 ] 29 30 31 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика