为何fmt.Printf输出行顺序颠倒?Go语言函数调用顺序疑问
Go语言函数参数求值顺序问题解答
问题描述
我是刚学习Golang的新手,编程经验较少。在学习math.Pow函数(来自Go语言之旅)时遇到问题:为何代码中fmt.Println调用的两个pow函数,pow(3,3,20)先输出27 >= 20,之后fmt.Println才输出pow(3,2,10)的返回值9和pow(3,3,20)的返回值20?实际输出与预期不符,恳请解惑。
代码示例
package main import ( "fmt" "math" ) func pow(x, n, lim float64) float64 { if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %g\n", v, lim) } return lim } func main() { fmt.Println( pow(3, 2, 10), pow(3, 3, 20), ) }
实际输出
27 >= 20 9 20
预期输出
9 27 >= 20
问题根源
你误解了函数调用的执行逻辑:Go语言里调用函数时,会先把所有参数的表达式都计算完毕,再执行函数本身。
具体到你的代码,fmt.Println(pow(3,2,10), pow(3,3,20))的执行流程是:
- 先按从左到右的顺序计算两个
pow函数的返回值:- 先执行
pow(3,2,10):计算得9,小于10,直接返回9,无任何输出 - 再执行
pow(3,3,20):计算得27,大于等于20,执行fmt.Printf输出27 >= 20,然后返回20
- 先执行
- 等两个
pow都执行完成、拿到返回值9和20后,才会调用fmt.Println打印这两个值,输出9 20
所以最终控制台的输出顺序是pow(3,3,20)执行时的输出先出现,然后是fmt.Println的输出,这和你预期的顺序不符,核心原因是你误以为fmt.Println会逐个处理参数(先打印第一个参数,再计算第二个参数),但实际上所有参数必须先完成求值,函数才会执行。
内容的提问来源于stack exchange,提问作者Flow3rize
相关产品推荐
相关产品推荐

