英文:
why does fmt.Printf swap rows?
问题
我最近开始学习Golang,但我没有太多的编程经验。在学习for循环和Math.Pow函数时,我遇到了一个问题。有人可以解释一下为什么在这个循环中,第二行(3, 3, 20)先被计算,然后才计算第一行(3, 2, 10)吗?而且,还给它分配了一个限制。如果有人能解释一下,我将非常感激。
我预期程序的输出应该是这样的:
9
27>=20
英文:
I recently started learning Golang and I don't have much programming experience. I ran into a problem while learning the for loop and the Math.Pow.(Tour of Go) function. Can someone explain why in this loop the second row (3, 3, 20) is counted first, and only then it counts the first (3, 2, 10). Moreover, a limit is also attributed to him. I would be very grateful if someone could clarify.
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)
}
// can't use v here, though
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
// Output:
// 27 >= 20
// 9 20
I expected the output of the program to look like this.
9
27>=20
答案1
得分: 2
Println的参数从左到右进行求值,所以你的调用
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
实际上变成了:
fmt.Println(
9,
20,
)
但除此之外,第二次调用pow(返回20)还调用了自己的Printf("27>=20"),所以你得到的结果实际上是明确定义且符合预期的。
英文:
Arguments of Println are evaluated from left-to-right, so your call
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
effectively becomes:
fmt.Println(
9,
20,
)
But in addition to that, second call to pow
(that returned 20) called Printf
on it's own ("27>=20"), so the result that you got is actually well-defined and expected.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论