Mengapa program ini mencetak 421 dalam hasilnya?

王林
Lepaskan: 2024-02-10 19:48:07
ke hadapan
882 orang telah melayarinya

Mengapa program ini mencetak 421 dalam hasilnya?

editor php Xiaoxin akan menjawab soalan biasa untuk anda dalam artikel ini: "Mengapa program ini mencetak 421 dalam hasil carian ini?" Kami akan membantu anda memahami dan menyelesaikan isu ini dengan menganalisis kemungkinan punca dan penyelesaian. Baca terus untuk jawapan terperinci.

Kandungan soalan

Saya tidak faham, kenapa program ini mencetak 421 而不是 431?

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())
}
Salin selepas log masuk

Di bawah saya telah menambah komen tekaan saya:

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f()) // x=1
    defer func() {
        defer o(recover()) // x=3 from panic (but if we ll execute this program we ll see 2)
        o(f()) // x=4
    }()

    defer f() // x=2
    defer recover() //nil

    panic(f()) // x=3
}
Salin selepas log masuk

Penyelesaian

defer 确实调用该函数,但它<确实“立即”评估其论点。另外,对 recover() 的调用仅在从延迟函数调用时停止紧急状态(defer receive() tidak memenuhi kriteria ini). Lihat Mengapa `deferrecover()` tidak mendapat panik?

Memandangkan ini: mari kita nombor baris:

L1: o := fmt.Println

L2: defer o(f()) // x = 1

L3: defer func() {
L4:     defer o(recover()) // recover() returns 2
L5:     o(f())             // x = 4, it gets printed
L6: }()

L7: defer f() // after panic: x = 3
L8: defer recover()

L9: panic(f()) // x = 2
Salin selepas log masuk

Proses pelaksanaan kod di atas adalah seperti berikut:

l2: Penilaian o() 的参数,调用 f()x 递增到 1 (稍后将打印)。 o() belum dipanggil lagi.

l3: Fungsi tertunda belum dipanggil lagi, seluruh badannya dilangkau buat sementara waktu.

l7: f() 尚未被调用,x 仍为 1.

l8: recover() tidak dipanggil.

l9: Panggil f(),将x递增到2,然后返回,因此2被传递给panic().

Kami berada dalam mod panik, jadi sekarang laksanakan fungsi tertunda (dalam susunan lifo).

l8: recover() dipanggil tetapi tidak menghentikan keadaan panik.

l7: f() 现在被调用,将 x 增加到 3.

l3: Fungsi tanpa nama ini kini dilaksanakan.

l4: recover() 返回 2 (传递给 panic() 的值),这将稍后打印,但尚未打印,因为对 o() Mengembalikan 2 (nilai yang dihantar kepada panic()), yang akan dicetak kemudian, tetapi belum dicetak lagi kerana o() > Panggilan kepada ditangguhkan. Keadaan panik berakhir di sini. <p>l5: Panggil <code>f(),将 x 递增到 4 untuk mencetaknya dengan segera.

l4: Fungsi kelewatan o() 现在被执行,打印上面的值 2.

l2: Fungsi kelewatan o() 现在被执行,打印之前计算的值 1.

Program tamat.

Atas ialah kandungan terperinci Mengapa program ini mencetak 421 dalam hasilnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!