鍍金池/ 問答/PHP/ 一個(gè)php簡單又復(fù)雜的問題

一個(gè)php簡單又復(fù)雜的問題

代碼如下:

<?php
$a = 7;
echo $a-- - - --$a;
echo $a;

運(yùn)行結(jié)果是125

求解計(jì)算機(jī)是如何計(jì)算出12的結(jié)果呢?

回答
編輯回答
舊言

7 - -5 = 12

2018年6月13日 12:00
編輯回答
舊螢火

感謝 @小草 的指出,很抱歉對樓主有一定的誤導(dǎo)。
之前我對后置運(yùn)算符的副作用生效時(shí)間理解有問題,查詢文檔之后,確認(rèn)了。

$a-- 返回 $a,然后將 $a 的值減一。

$a-- 返回的是 $a 減一 之前的值。

修改之后的回答如下:

原理依據(jù): 運(yùn)算符的優(yōu)先級遞增/遞減運(yùn)算符

優(yōu)先級規(guī)則如下:
clipboard.png

遞增運(yùn)算符規(guī)則如下:
clipboard.png

解釋如下:

  1. 根據(jù)優(yōu)先級規(guī)則,題中代碼等價(jià)于

<?php
$a = 7;
echo ($a--) - (- (--$a));
echo $a;

其中,第一個(gè) echo 中,根據(jù) -- 運(yùn)算符優(yōu)先級

  • $a-- 先執(zhí)行,但是其副作用在此 第一個(gè)括號之后生效,所以此時(shí)參與運(yùn)算的是 7,但是 $a 的值已經(jīng)變成了 6

  • --$a$a-- 后執(zhí)行,但是其副作用先生效,此時(shí) $a 的值變成了 5,并參與后邊運(yùn)算

所以,第一個(gè) echo 等價(jià)于:echo 7 - (-5),結(jié)果為 12;
第二個(gè) echo$a 經(jīng)過兩次遞減之后的值:5

下邊從 opcode 角度來看這段代碼,如下圖所示:
clipboard.png

我們可以看到,POST_DEC 生成,PRE_DEC 后生成,然后是兩個(gè) SUB。
其中,需要特別理解的是,后置遞減副作用的生效節(jié)點(diǎn)。

2018年1月2日 10:57
編輯回答
拮據(jù)

有意思了,我也覺得是 7- -5=12。

$a = 7;
$a-- + $a;    //輸出13,7+6

運(yùn)算符后面 $a--的副作用已經(jīng)產(chǎn)生了。

2017年9月8日 00:51