猿问

移位操作的优先级不明确

我一直在努力处理 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

这有点笨拙,但这会返回正确的数字。第一种方法不应该产生正确的结果,先移位然后再做算术吗?


互换的青春
浏览 153回答 3
3回答

墨色风雨

$X <<= 1 + 1转换为:$X = $X << (1 + 1)如果你想以不同的方式做,那么你可以使用:$X = ($X << 1) + 1

慕尼黑的夜晚无繁华

请参阅运算符优先级表和说明。该+运营商比优先级更高<<=。您可以通过用括号分组来强制优先():$X&nbsp;=&nbsp;($X&nbsp;<<=&nbsp;1)&nbsp;+&nbsp;1;另请注意:使用括号,即使不是绝对必要的,通常也可以通过显式分组而不是依赖于隐式运算符优先级和关联性来提高代码的可读性。

繁星coding

感谢您的意见!其实 '<<=' 不仅是一个运算符,也是一个赋值,所以$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.
随时随地看视频慕课网APP
我要回答