netlib.narod.ru< Назад | Оглавление | Далее >

Выражения и операторы

Один из самых важных справочников для программирующих на С — таблица, в которой приведен порядок выполнения всех операций языка С. (Когда-то можно было купить футболку с напечатанной на ней вверх ногами этой таблицей — для удобства чтения.) Аналогичная таблица С# немного отличается от нее в первых двух строках: в них присутствуют некоторые дополнительные операторы и отсутствует оператор «,» (запятая).


Порядок вычисления в С#



Тип оператора Оператор Ассоциативность

Первичные операторы (x) x.y f(x) a[x] x++ x-- new
typeof sizeof checked unchecked
Слева направо
Унарные операторы + - ! ~ ++x --x (тип)x Слева направо
Мультипликативные операторы * / % Слева направо
Аддитивные операторы + - Слева направо
Операторы сдвига << >> Слева направо
Операторы отношения < > <= >= is as Слева направо
Операторы равенства == != Слева направо
Логическое И & Слева направо
Логическое исключающее ИЛИ ^ Слева направо
Логическое ИЛИ | Слева направо
Условное И && Слева направо
Условное ИЛИ || Слева направо
Условный оператор ?: Справа налево
Операторы присваивания = *= /= %= += -= <<= >>= &= ^= |= Справа налево


Я хотел бы обсудить некоторые тонкости использования двух видов операторов И и ИЛИ, так как они могут вызывать путаницу; по крайней мере, так было у меня при первом знакомстве с ними.

Заметьте, что операторы &, ^ и | называются логическими И, исключающим ИЛИ и ИЛИ; в С они назывались побитовыми. В С# логические И, исключающее ИЛИ и ИЛИ определены для целых типов данных и для типа bool. Для целых типов они выполняются как побитовые, точно так же, как в С. Например, результатом вычисления выражения:

  0x03 | 0x05

будет 0x07. Для переменных или выражений типа bool результат выполнения логических операторов также имеет тип bool. Результатом логического оператора И является true, когда оба операнда — true. Результатом логического исключающего ИЛИ является true, когда один операнд — true, а другой — false. Результат логического ИЛИ — true, когда хотя бы один из операндов — true.

Операторы && и || называются в языке С логическими. В С# они называются условными И и ИЛИ и определены только для типа данных bool.

С-программисты привыкли использовать && и || в конструкциях вида:

  if (а != 0 && b >= 5)

Кроме того, С-программисты знают, что если результат вычисления первого выражения — false (т.е. если а равно 0), то второе выражение не вычисляется. Это важно знать, так как второе выражение может выполнять присваивание или вызывать функцию. Аналогично при использовании оператора || второе выражение не вычисляется, если результат первого выражения — true.

В С# операторы && и || используются точно так же, как в С. Они называются условными И и ИЛИ, так как второй операнд в них вычисляется только при необходимости.

В С# можно использовать операторы & и | так же, как и && и ||, например:

  if {а != 0 & b >= 5)

При таком использовании операторов & и | в С# вычисляются оба выражения независимо от результата первого выражения.

Второй вариант инструкции if допустим и в С, и он будет работать так же, как в С#. Однако большинство использующих С программистов, вероятно, написало бы такую инструкцию только по ошибке. Эта инструкция просто выглядит для меня неправильной и заставляет звенеть звоночек в моей голове, так как я приучил себя рассматривать & как побитовое И, а && как логическое И. Но в С результатом отношений или логических выражений является значение типа int: 1, если выражение истинно, 0 — в противном случае. Поэтому побитовый оператор И также будет работать правильно.

Программист на С может сделать инструкцию, использующую &&, немного короче, записав ее так:

  if (a && b >= 5)

Это прекрасно работает в С, потому что С рассматривает любые ненулевые выражения как истинные. Однако в С# такая конструкция не допускается, так как оператор && определен только для типа bool.

Но при использовании побитового оператора И в сокращенной форме выражения программист на С столкнется с большими проблемами:

  if (а & b >= 5)

Если b равно 7, выражение справа получит значение 1. Если а равно 1, 3 или любому другому нечетному числу, то результатом побитовой операции будет true. Если а — 2 или любое четное число, то результатом побитового И будет 0, а результатом всего выражения — false. Скорее всего такие результаты совершенно не то, на что рассчитывал программист. Именно поэтому С-программисты столь болезненно реагируют на побитовые операторы И и ИЛИ в логических выражениях. В С# такие операторы запрещены, так как целые числа и значения типа bool не могут совместно использоваться в логических операторах И, исключающее ИЛИ и ИЛИ.

В плане приведения типов С# гораздо строже, чем С. Если нужно преобразовать один тип данных в другой, а ограничения С# не позволяют этого, может пригодиться класс Convert. Он определен в пространстве имен System и содержит многие методы, среди которых, возможно, есть те, что вам подойдут. Если требуется интерфейс с существующим кодом, можно использовать класс Marshal, определенный в пространстве имен System.Runtime.InteropServices. Он содержит метод Сору, позволяющий передавать данные между массивами С# и областями памяти, на которые ссылаются указатели.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz