亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

后增量表現怪異

后增量表現怪異

PHP
喵喵時光機 2022-07-29 11:02:34
我已將問題縮小到此代碼$a = 3;$a = 3 * $a++;  echo $a; //9$a = 3;$a = $a * $a++;  echo $a; //12這是第一次操作的 VLD 操作碼compiled vars:  !0 = $aline     #* E I O op                           fetch          ext  return  operands-------------------------------------------------------------------------------------   2     0  E >   ASSIGN                                                   !0, 3   3     1        POST_INC                                         ~2      !0         2        MUL                                              ~3      ~2, 3         3        ASSIGN                                                   !0, ~3   4     4        ECHO                                                     !0   5     5      > RETURN                                                   1第二次操作 ($a * $a++)compiled vars:  !0 = $aline     #* E I O op                           fetch          ext  return  operands-------------------------------------------------------------------------------------   2     0  E >   ASSIGN                                                   !0, 3   3     1        POST_INC                                         ~2      !0         2        MUL                                              ~3      !0, ~2         3        ASSIGN                                                   !0, ~3   4     4        ECHO                                                     !0   5     5      > RETURN                                                   12個問題:為什么先執行后增量?這對我來說沒有任何意義。傳統上,我認為它會在執行表達式中的所有其他操作后增加變量。這也是 PHP 官方網站上所說的。因此,按照我的邏輯(這可能存在難以置信的缺陷),兩個表達式都將返回 10。但正如我們所看到的,POST_INC 是在執行其他任何操作之前執行的。正如我們所看到的,在MUL操作期間,對于第一種情況,~2應該是 POST_INC 的結果(所以值應該是 4),然后乘以 3 是 12。但在第二種情況下,!0仍然是3, ~2似乎也持有3的值,原因我不知道,所以我們最終得到 9。為什么會這樣?我不流利地閱讀操作碼,所以也許我錯過了一些東西,我猜操作數的順序~2, 3 vs !0, ~2很重要,但我不明白怎么做。
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

這里的關鍵角色是運算符優先級,因此,盡管是表達式中的最后一個元素,但首先$a++計算(在 ie 之前)。請注意,其中的意思是對該表達式(變量)的操作后評估,而不是對整個表達式(代碼行)的評估。$apostpost increment


在您的第一種情況下,代碼是這樣的:


$result = 3 * $a++;

所以$a用于乘法的值是3因為它是先讀取然后遞增的。該表達式中不再$a使用,因此新值 of$a并不重要,除非$a再次引用,否則不會影響我們:


     $a = 3

$result = 3 * $a++

        = 3 * 3 

                // $a is 4 now

        = 9

第二種情況不同:


$result = $a * $a++;

因為我們對$a. 評估將是這樣的:


     $a = 3

$result = $a * $a++

        = $a * 3  // value of `$a` is 4 after post-increment

                  // evaluation, and this affects us as we 

                  // evaluate $a again

        = 4 * 3

        = 12

為了答案的完整性,讓我們再添加一個案例:


$result = $a++ * $a++;

評估將類似地進行,$a最后具有不同的價值:


     $a = 3

$result = $a++ * $a++

         // $a is 4 now

        = 3 * $a++

        = 3 * 4

                 // $a is 5 now

        = 12

一旦你理解了這一點,這看起來很清楚,但另一方面很好地展示了你可以通過編寫你認為你知道它是如何工作的代碼而不是它的實際工作原理來輕松地超越自己 :) 所以你要么需要仔細閱讀語言文檔以確保您確定自己編寫的代碼會做什么,或者在未來的調試會話中為了個人理智而避免編寫過于“聰明”的代碼:) KISS原則的存在是有原因的。


查看完整回答
反對 回復 2022-07-29
  • 1 回答
  • 0 關注
  • 100 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號