为了账号安全,请及时绑定邮箱和手机立即绑定

移位操作的优先级不明确

移位操作的优先级不明确

PHP
互换的青春 2021-09-05 16:40:36
我一直在努力处理 PHP 中的移位运算符,假设它在算术运算之前,如 +、1 等。我在 php 手册中找不到任何定义。假设我有值 1,我想要 3,然后是 7,等等,从右边(LSB)填充位。我试过:$X = 1;然后,在一个循环中:$X <<= 1 + 1; // returns 4 instead of 3.$X <<= 1 + 1; // returns 16 instead of 7.所以显然 1+1 是在移位之前计算的。我的解决方案:$X = 1;$X <<= 1; // $X=2$X += 1;  // $X=3 as expected$X <<= 1; // $X=6$X += 1;  // $X=7 as expected这有点笨拙,但这会返回正确的数字。第一种方法不应该产生正确的结果,先移位然后再做算术吗?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

$X <<= 1 + 1

转换为:

$X = $X << (1 + 1)

如果你想以不同的方式做,那么你可以使用:

$X = ($X << 1) + 1


查看完整回答
反对 回复 2021-09-05
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

请参阅运算符优先级表和说明。该+运营商比优先级更高<<=。您可以通过用括号分组来强制优先()

$X = ($X <<= 1) + 1;

另请注意:

使用括号,即使不是绝对必要的,通常也可以通过显式分组而不是依赖于隐式运算符优先级和关联性来提高代码的可读性。


查看完整回答
反对 回复 2021-09-05
?
繁星coding

TA贡献1797条经验 获得超4个赞

感谢您的意见!其实 '<<=' 不仅是一个运算符,也是一个赋值,所以


$X <<= 1 + 1 will be interpreted as $X <<= 2.

$X = $X << 1 + 1 might possibly work (I haven't checked), but

$X = ($X << 1) + 1 as suggested by Ilya would be the right way.


查看完整回答
反对 回复 2021-09-05
  • 3 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信