"операции n = n / 2: " + n) ;
// Разделить на 4.
n = n >> 2;
Console.WriteLine("Значение переменной n: после " +
"операции n = n / 4: " + n) ;
Console.WriteLine();
// Установить переменную n в исходное состояние,
n = 10;
Console.WriteLine("Значение переменной n: " + n);
// Умножить на 2 тридцать раз.
n = n << 30; // данные теряются
Console.WriteLine("Значение переменной n после " +
"сдвига на 30 позиций влево: " + n);
}
}
Ниже приведен результат выполнения этой программы.
Значение переменной n: 10
Значение переменной n: после операции n = n * 2: 20
Значение переменной n: после операции n = n * 4: 80
Значение переменной n: после операции n = n / 2: 40
Значение переменной n: после операции n = n / 4: 10
Значение переменной n: 10
Значение переменной n после сдвига на 30 позиций влево: -2147483648
Обратите внимание на последнюю строку приведенного выше результата. Когда целое значение 10 сдвигается влево тридцать раз подряд, информация теряется, поскольку двоичные разряды сдвигаются за пределы представления чисел для типа int. В данном случае получается совершенно ''непригодное" значение, которое оказывается к тому же отрицательным, поскольку в результате сдвига в старшем разряде, используемом в качестве знакового, оказывается 1, а следовательно, данное числовое значение должно интерпретироваться как отрицательное. Этот пример наглядно показывает, что применять операторы сдвига для умножения или деления на 2 следует очень аккуратно. (Подробнее о типах данных со знаком и без знака см. в главе 3.)
Поразрядные составные операторы присваивания
Все двоичные поразрядные операторы могут быть использованы в составных операциях присваивания. Например, в двух приведенных ниже операторах переменной х присваивается результат выполнения операции исключающее ИЛИ над первоначальным значением переменной х и числовым значением 127.
х = х ^127;
х ^= 127;
Оператор ? относится к числу самых примечательных в С#. Он представляет собой условный оператор и часто используется вместо определенных видов конструкций if-then-else.
Оператор ? иногда еще называют тернарным, поскольку для него требуются три операнда. Ниже приведена общая форма этого оператора.
Выражение1 ? Выражение2 : Выражение3 ;
Здесь Выражение1
должно относиться к типу bool,
а Выражение2
и Выражение3
— к одному и тому же типу. Обратите внимание на применение двоеточия и его местоположение в операторе ?
.
Значение выражения ?
определяется следующим образом. Сначала вычисляется Выражение1
. Если оно истинно, то вычисляется Выражение2
, а полученный результат определяет значение всего выражения ?
в целом. Если же Выражение1
оказывается ложным, то вычисляется Выражение3
, и его значение становится общим для всего выражения ?
. Рассмотрим следующий пример, в котором переменной absval
присваивается значение переменной val
.
absval = val < 0 ? -val : val; // получить абсолютное значение переменной val
В данном примере переменной absval
присваивается значение переменной val
, если оно больше или равно нулю. Если же значение переменной val
отрицательно, то переменной absval
присваивается результат отрицания этого значения, что в итоге дает положительное значение.
Ниже приведен еще один пример применения оператора ?
. В данной программе одно число делится на другое, но при этом исключается деление на нуль.
// Исключить деление на нуль, используя оператор?.
using System;
class NoZeroDiv {
static void Main() {
int result;
for(int i = -5; i < 6; i++) {
result = i != 0 ? 100 / i : 0;
if (i != 0)
Console.WriteLine("100 / " + i + " равно " + result);
}
}
Читать дальше