为什么把define 里面的(l+r)/2改为l+r>>1为出现玄学错误

P3372 【模板】线段树 1

@[hwwqy](/user/363669) 你多打个括号估计就可以了 ``` (l+r>>1) ```
by bamboo1030 @ 2023-08-24 20:08:15


`((l)+(r)>>1)`
by _•́へ•́╬_ @ 2023-08-24 20:08:42


@[bamboo123](/user/369181) 确实,可为什么会这样呢
by hwwqy @ 2023-08-24 20:12:53


@[hwwqy](/user/363669) 就是宏定义他是直接替换不是定义了个函数,要多加括号保证运算顺序,位移运算优先级不高于加减
by bamboo1030 @ 2023-08-24 20:14:17


```cpp ((l+r)>>1) ```
by vanishingloser @ 2023-08-24 20:19:18


打括号就可以了 ```cpp (l+r>>1) ``` << 是位运算,优先级比较低,而宏只负责替换,不计算,所以有可能其他的先进行了运算 比如: ```cpp r-mid ``` 会变成 ```cpp r-l+r>>1 ``` 此时先算r-l+r
by wzhm54nr @ 2023-09-04 14:47:46


|