|
Программирование >> Процедурные приложения
В последнем примере результат состоит из двух байтов, так как в процессе операции побитового отрицания осуществляется повышение целочисленности операнда - его тип преобразуется к типу с большей размерностью. Если операнд беззнаковый, то результат получается вычитанием его значения из самого большого числа повышенного типа. Если операнд знаковый, то результат вычисляется посредством приведения операнда повышенного типа к беззнаковому типу, выполнения операции ~ и обратного приведения его к знаковому типу. Операторы сдвига Языки 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++ вы найдете все стандартные арифметические операторы, в частности операторы сложения (+), вычитания (-), умножения (*), деления (/) и деления по модулю (%). Первые четыре понятны и не требуют разъяснений. Возможно, имеет смысл остановится на операции деления по модулю:
При делении по модулю возвращается остаток от операции целочисленного деления. Поскольку в последней строке делается попытка деления на 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++:
Логические операторы И (&&),ИЛИ ( ) и НЕ (!)возвращают значение true или false в зависимости от логического отношения между их операндами. Так, оператор && возвращает true, когда истинны (не равны нулю) оба его аргумента. Оператор возвращает false только в том случае, если ложны (равны нулю) оба его аргумента. Оператор ! просто инвертирует значение своего операнда с false на true и наоборот. Следующий пример программы на языке С демонстрирует применение перечисленных выше операторов сравнения и логических операторов. /* 86
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |