有人可以解释一下为什么
echo "0123" | "3456";
返回 3577 以及为什么在 ruby 中
0123 | 3456
将返回 3539
编辑:这是一个不好的例子,因为 ruby 的版本不是字符串。
但是在 JS
"0123" | "3456"
将返回 3539
编辑:ELI5 :)
你的答案很简单:字符串和整数不一样:
var_dump("0123" | "3456");//string(4) "3577"
var_dump(0123 | 3456); //int(3539)
还要注意oct integers的 0** 表示法。
请注意,PHP 片段对字符串进行操作,而 ruby 片段对数字进行操作。另请注意,在红宝石中,数字 0123 是八进制的,因为初始值为 0。
在 PHP 中,字符串之间的按位或计算为每个字符之间的按位或,因此结果将首先是 0|3,即 3,然后是 1|4,即 5,然后是 2|5,即 7,然后然后是 3|6,即 7。请注意,该操作是用字符计算的,因此例如 2|9 会给你;
.
要查看 ruby 如何计算结果,您必须首先将第二个操作数转换为以 8 为底或二进制:它是 6600,以 8 为底,按位或的结果是 6723,以 8 为底,或 3539 以十进制。
PHP 有时很奇怪:
echo 0123 | 3456; //0123 is interpret as an octal number
返回 3539
echo 123 | 3456;
返回 3579
echo (int)"0123" | (int)"3456";
返回 3579
echo "0123" | "3456";
返回 3577
如果左侧和右侧参数都是字符串,则按位运算符将对字符的 ASCII 值进行操作!