php 편집자 Xiaoxin은 이 기사에서 "이 프로그램이 결과에 421을 인쇄하는 이유는 무엇입니까?"라는 일반적인 질문에 답할 것입니다. 이 질문에는 프로그램의 특정 논리나 오류가 포함될 수 있습니다. 가능한 원인과 해결 방법을 분석하여 이 문제를 이해하고 해결하도록 도와드리겠습니다. 자세한 답변을 보려면 계속 읽어보세요.
이해가 안되는데 왜 이 프로그램이 인쇄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()) }
defer
确实不调用该函数,但它recover() 的调用仅在从延迟函数调用时停止紧急状态(defer receive()
은 이 기준을 충족하지 않습니다. `deferrecover()`가 패닉을 포착하지 못하는 이유는 무엇입니까?를 참조하세요.
이렇게 생각하면: 줄에 번호를 매기자:
으아악위 코드의 실행 과정은 다음과 같습니다.
l2: 평가 o()
的参数,调用 f()
,x
递增到 1
(稍后将打印)。 o()
가 아직 호출되지 않았습니다.
l3: 지연된 함수가 아직 호출되지 않았으며 전체 본문을 일시적으로 건너뜁니다.
l7: f()
尚未被调用,x
仍为 1
.
l8: recover()
호출되지 않습니다.
l9: 전화f()
,将x
递增到2
,然后返回,因此2
被传递给panic()
.
패닉 모드에 있으므로 이제 지연된 기능을 (lifo 순서로) 실행합니다.
l8: recover()
이 호출되지만 패닉 상태를 멈추지 않습니다.
l7: f()
现在被调用,将 x
增加到 3
.
l3: 이제 이 익명 함수가 실행됩니다.
l4:recover()
返回 2
(传递给 panic()
的值),这将稍后打印,但尚未打印,因为对 o()
나중에 인쇄될 2
(panic()
에 전달된 값)를 반환하지만 o() > 호출이 연기되었습니다. 패닉상태는 여기서 끝입니다.
<p>l5: <code>f()
,将 x
递增到 4
에 전화하면 즉시 인쇄할 수 있습니다.
l4: 지연 기능 o()
现在被执行,打印上面的值 2
.
l2: 지연 기능 o()
现在被执行,打印之前计算的值 1
.
프로그램이 종료됩니다.
위 내용은 이 프로그램은 왜 결과에 421을 인쇄합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!