
php エディターの Xiaoxin が、この記事でよくある質問に答えます。「なぜこのプログラムは結果に 421 を出力するのですか?」この質問には、プログラム内の何らかの特定のロジックやエラーが含まれる可能性があります。エラー。考えられる原因と解決策を分析することで、この問題の理解と解決をお手伝いします。詳細な回答については、読み続けてください。
理解できませんが、なぜこのプログラムでは431ではなく421が出力されるのでしょうか?
以下に私の推測によるコメントを追加しました:
package main import "fmt" var x int func f() int { x++ return x } func main() { o := fmt.println defer o(f()) defer func() { defer o(recover()) o(f()) }() defer f() defer recover() panic(f()) }
defer関数は呼び出しませんが、recover() の呼び出しは、遅延関数から呼び出された場合にのみパニック状態を停止します (defer accept()はこの条件を満たしません)。 「deferrecover()」がパニックを捕捉しないのはなぜですか? を参照してください。
リーリー
上記のコードの実行プロセスは次のとおりです:
l2:o()の引数を評価し、f()を呼び出します。xは1にインクリメントされます (出力されます)後で) 。o()はまだ呼び出されていません。
f()はまだ呼び出されていません。xはまだ1です。
recover()が呼び出されませんでした。
f()を呼び出し、xを2にインクリメントしてから戻り、2がに渡されます。パニック()###。パニック状態になっているので、遅延した関数を (lifo の順序で) 実行します。
l8:
recover()が呼び出されますが、パニック状態は停止しません。l7:
が呼び出され、xが3に増加します。l3: この匿名関数が実行されます。
recover()
は2(
panic()に渡される値) を返します。これは後で出力されますが、次の理由によりまだ出力されていません。
o()の呼び出しは延期されます。パニック状態はここで終わります。
l5: f()
を呼び出し、xを4にインクリメントし、すぐに出力します。l4: 遅延関数
が実行され、上記の値2が出力されます。l2: 遅延関数
が実行され、以前に計算された値1が出力されます。プログラムは終了します。
以上がこのプログラムはなぜ結果に 421 を出力するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。