好奇:为什么移位运算符的优先级低于加法运算符

本文关键字:运算符 优先级 于加法 为什么 好奇 | 更新日期: 2023-09-27 18:11:48

我想知道为什么移位运算符(<<和>>),分别等价于乘法和除法,其优先级确实低于加法运算符,如"+"。

换句话说:

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

而:

int a = 1 + 2 << 3; //yields 24
有谁知道这种行为背后的原因吗?

注意:请不要回答我"因为规格是这样说的"!

提前感谢大家。

编辑:我意识到左移可以通过左操作数本身相加来获得。这就是原因吗?

好奇:为什么移位运算符的优先级低于加法运算符

算术运算符和位运算符的相对优先级是不相关的,因为无论如何都不应该同时使用它们。如果您想将整数视为位数组,那么不要像数字一样对其进行加减运算。如果你想把一个整数当作一个数字来对待,那么就不要像对待一个位数组那样对它进行移位、或运算和再运算。

坦率地说,如果我有自己的方式,就不会有整数上的位移位操作;你必须将整型转换为BitArray类型,它不会有算术运算。int既被视为位数组又被视为数字,这是由于历史原因而存在的一个不幸的设计缺陷。

认为位移位是一种乘法和除法的概念是一个奇怪的概念;位移位是位移位,不是乘法。

如果我要把一个理性的决定归因于它,我会说这是因为在某些常见情况下方便,例如在构造位模式时:A + B << 8将在第二位最低有效字节中标记位a和位B。

当然也可以是一个随机的优先级分配,因为Dennis Ritchie不知道它在哪里更适合(我公然假设c#从C继承了运算符优先级)。不幸的是,他不在这里告诉我们了。(