Операторы (сравнение 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.

ms228601.alert_note(ru-ru,VS.90).gifПримечание.

Можно также указать, требуется ли проверка арифметического переполнения в блоке кода, с помощью переключателя компилятора с интерфейсом командной строки (/checked) или непосредственно в Visual Studio отдельно для каждого проекта.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Операторы C#

Другие ресурсы

Язык программирования C# для разработчиков на Java