Операторы (сравнение C# и Java)
Обновлен: Ноябрь 2007
C# позволяет использовать все применимые операторы, поддерживаемые в Java, как указано в следующей таблице. В конце данной таблицы перечислены некоторые новые операторы, доступные в C#, но не в Java:
Категория |
Символ |
---|---|
Унарные |
++--+-!~() |
Мультипликативные |
*/% |
Аддитивные |
+ - |
Сдвиг |
<< >> |
Реляционные |
< > <= >= instanceof |
Операторы равенства |
== != |
Логическое И |
& |
Логическое исключающее XOR |
^ |
Логическое OR |
| |
Условный оператор AND |
&& |
Условный оператор OR |
|| |
Условные |
? : |
Операторы присваивания |
= *= /= %= += -= <<= >>= &= ^= |= |
Тип операнда |
typeof |
Размер операнда |
sizeof |
Принудительная проверка переполнения |
checked |
Запрет проверки переполнения |
unchecked |
Оператор Java, который недоступен в C#, это оператор сдвига (>>>). Этот оператор используется в языке Java из-за малого числа в нем беззнаковых переменных для случаев, когда требуется смещение вправо для вставки 1 в наиболее важные разряды.
Язык C# поддерживает беззнаковые переменные, поэтому в C# требуется только стандартный оператор >>. Данный оператор выдает различные результаты в зависимости от того, имеет операнд знак или нет. При сдвиге вправо беззнакового числа в самый важный бит вставляется 0, а при сдвиге вправо числа со знаком выполняется копирование предыдущего самого важного бита.
Операторы Checked и Unchecked
Арифметические операции вызывают переполнение, если результат слишком большой для количества бит, выделенных для используемого типа данных. Такое переполнение может быть проверено или проигнорировано для данной целочисленной арифметической операции с помощью ключевых слов checked и unchecked. Если выражение является константным выражением, использующим оператор checked, во время компиляции возникает ошибка.
Ниже приведен простой пример, поясняющий данные операторы:
class TestCheckedAndUnchecked
{
static void Main()
{
short a = 10000;
short b = 10000;
short c = (short)(a * b); // unchecked by default
short d = unchecked((short)(10000 * 10000)); // unchecked
short e = checked((short)(a * b)); // checked - run-time error
System.Console.WriteLine(10000 * 10000); // 100000000
System.Console.WriteLine(c); // -7936
System.Console.WriteLine(d); // -7936
System.Console.WriteLine(e); // no result
}
}
В этом коде оператор unchecked позволяет обойти ошибку во время компиляции, которая была бы вызвана следующим оператором:
short d = unchecked((short)(10000 * 10000)); // unchecked
Следующее выражение по умолчанию не проверяется, поэтому переполнение значения выполняется без предупреждения:
short c = (short)(a * b); // unchecked by default
Во время выполнения можно выполнить принудительную проверку этого выражения на предмет переполнения с помощью оператора checked:
short e = checked((short)(a * b)); // checked - run-time error
Если двум первым значениям присвоены d и c, при выполнении программы переполнение выполняется без предупреждения на значении -7936, однако при попытке умножения значения для "e" с помощью checked() программа вызывает исключение OverflowException.
Примечание. |
---|
Можно также указать, требуется ли проверка арифметического переполнения в блоке кода, с помощью переключателя компилятора с интерфейсом командной строки (/checked) или непосредственно в Visual Studio отдельно для каждого проекта. |
См. также
Основные понятия
Руководство по программированию в C#