Любопытство: почему операторы сдвига имеют меньший приоритет, чем аддитивные? - PullRequest
2 голосов
/ 21 октября 2011

Мне интересно, почему операторы сдвига (<< и >>), эквивалентные умножению и делению соответственно, имеют меньший приоритет, чем аддитивный оператор, такой как "+".

Другими словами:

int a = 1 + 2 * 8;  //yields 17

, тогда как:

int a = 1 + 2 << 3; //yields 24

Кто-нибудь знает, в чем причина такого поведения?

ПРИМЕЧАНИЕ: Пожалуйста, не отвечайте мне ", потому чтоспецификации говорят так "!

Заранее всем спасибо.

РЕДАКТИРОВАТЬ: Я понял, что сдвиг влево можно получить путем суммирования левого операнда сам по себе.Может быть в этом причина?

Ответы [ 2 ]

8 голосов
/ 21 октября 2011

Относительный приоритет арифметических и побитовых операторов не имеет значения, потому что вы все равно никогда не должны использовать их вместе. Если вы хотите рассматривать целое число как массив битов, то не добавляйте ивычитая это как число.Если вы хотите трактовать целое число как число, то не сдвигайте и не перемещайте его, как массив битов.

Честно говоря, если бы у меня был свой путь, не было бы сдвига битов.операции над целыми числами;вам нужно привести целое число к типу BitArray, в котором нет арифметики.Тот факт, что целые числа рассматриваются как как битовые массивы, так и числа, является прискорбным недостатком дизайна, который существует по историческим причинам.битовое смещение битовое смещение, а не умножение.

6 голосов
/ 21 октября 2011

Если бы я приписал ему рациональное решение, я бы сказал, что это удобно в некоторых распространенных ситуациях, например, при построении битовых комбинаций: A + B << 8 помечает биты A и B в порядке от второго к младшемуbyte.

Это может быть также случайное распределение приоритетов, конечно, потому что Деннис Ричи не имел ни малейшего представления, где он будет лучше подходить (очевидно, C # наследует приоритеты операторов от C).К сожалению, он здесь не для того, чтобы рассказать нам больше.(

...