$a = 1;$b = &$a; //アドレスを渡します。この行をコメントアウトすると 5 が返されます。コメントアウトされていない場合 (PHP バージョン <7) は、6$c = ( $a) ( $a);echo $c;Does it を返します。バージョンとか関係あるの??また、結果は 6 ですが、これは私にとって非常に不可解です
认证高级PHP讲师
この操作は、$a和$b都指向原本$a变量所在的那块内存(为了方便后面解释,称为内存X),也就是说,后面任何对于$a或者$bのすべての操作がこのメモリ内の値を直接変更していると考えることができます。
$a
$b
内存X
この行を追加した後の実行プロセス:
前の手順は省略され、最初のaは1です
$c = (++$a) + (++$a)的两次++$a都是在操作内存X,也就是把内存X里的值自增了两次,所以,在运算$c的值的时候,取的是这个内存里数的值,也就是自增了两次之后的内存X里的值。所以,是3 + 3 = 6(运算$c时候,内存Xに格納される値は 3) です。
$c = (++$a) + (++$a)
++$a
3 + 3 = 6
$c
引用されていない場合は、$a的自增接操作直接修改内存X,而后通过运算符操作返回内存X的副本,这样,两次的++$a结果由于不是直接从内存X获取的,而是改变内存X值之后的副本,所以$c在运算的时候就是2 + 3 = 5について。
内存X的副本
2 + 3 = 5
これは PHP の根本的な実装に関連するもので、長い話になります。 PHP のバグによって引き起こされた調査を参照することをお勧めします。 https://github.com/xurenlu /ふ...
C を出力しましたが、C は B とどのような関係がありますか?
まずは参照代入を追加する操作についてお話しましょう
リーリーこの操作は、
$a
和$b
都指向原本$a
变量所在的那块内存(为了方便后面解释,称为内存X
),也就是说,后面任何对于$a
或者$b
のすべての操作がこのメモリ内の値を直接変更していると考えることができます。この行を追加した後の実行プロセス:
前の手順は省略され、最初のaは1です
$c = (++$a) + (++$a)
的两次++$a
都是在操作内存X
,也就是把内存X
里的值自增了两次,所以,在运算$c的值的时候,取的是这个内存里数的值,也就是自增了两次之后的内存X
里的值。所以,是3 + 3 = 6
(运算$c
时候,内存X
に格納される値は 3) です。リファレンスをコメントしてから操作について話しましょう
引用されていない場合は、
$a
的自增接操作直接修改内存X
,而后通过运算符操作返回内存X的副本
,这样,两次的++$a
结果由于不是直接从内存X
获取的,而是改变内存X
值之后的副本,所以$c
在运算的时候就是2 + 3 = 5
について。これは PHP の根本的な実装に関連するもので、長い話になります。
PHP のバグによって引き起こされた調査を参照することをお勧めします。
https://github.com/xurenlu /ふ...
C を出力しましたが、C は B とどのような関係がありますか?