为什么我的循环不按照描述的顺序执行命令
Why does my loop execute commands not in the order they are described
现在我正在努力学习围棋
我有密码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var wallCount int
var width, height, area float64
var r = bufio.NewReader(os.Stdin)
fmt.Print("WallCount:")
fmt.Scanf("%d", &wallCount)
fmt.Printf("wallcount = %v \n", wallCount)
for x := 1; x <= wallCount; x++ {
fmt.Printf("wight, height at %v times\n", x)
fmt.Fscanf(r, "%d %d", &width, &height)
area += width * height
}
fmt.Printf("area = %v\n", area)
}
在编译代码的时候
在终端上:
WallCount:
进入第 4 学期
WallCount:4
---
wallcount = 4
wight, height at 1 times
wight, height at 2 times
进入学期 1,1
WallCount:4
wallcount = 4
wight, height at 1 times
wight, height at 2 times
1,1
---
wight, height at 3 times
wight, height at 4 times
area = 0
你能解释一下吗
- 为什么我的
for loops
运行 第一次 cmd 两次然后 运行 第二次 cmd 然后再次第一次 cmd 两次最后运行最后一个 cmd?
- 为什么
area
包含 0?
这里有些地方出了问题。首先,您使用了 %d
,它表示一个整数值,而您使用的是浮点值(使用 %f
)。
这个函数:fmt.Fscanf(r, "%d %d", &width, &height)
returns两个值。第一个值是它成功解析的项目数,第二个值是一个错误。您应该始终检查返回的错误是否不是 nil
,这意味着出现错误:
func main() {
var wallCount int
var width, height, area float64
var r = bufio.NewReader(os.Stdin)
fmt.Print("WallCount:")
fmt.Scanf("%d", &wallCount)
fmt.Printf("wallcount = %v \n", wallCount)
for x := 1; x <= wallCount; x++ {
fmt.Printf("wight, height at %v times\n", x)
_, err := fmt.Fscanf(r, "%f %f\n", &width, &height)
if err != nil {
log.Println(err)
return
}
area += width * height
}
fmt.Printf("area = %v\n", area)
}
在这种情况下,错误非常清楚地描述了错误所在,即:bad verb '%d' for float64
。在 go 中,这种检查错误是否为 nil 的形式非常常见,你应该经常检查你的错误。
现在我正在努力学习围棋
我有密码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var wallCount int
var width, height, area float64
var r = bufio.NewReader(os.Stdin)
fmt.Print("WallCount:")
fmt.Scanf("%d", &wallCount)
fmt.Printf("wallcount = %v \n", wallCount)
for x := 1; x <= wallCount; x++ {
fmt.Printf("wight, height at %v times\n", x)
fmt.Fscanf(r, "%d %d", &width, &height)
area += width * height
}
fmt.Printf("area = %v\n", area)
}
在编译代码的时候
在终端上:
WallCount:
进入第 4 学期
WallCount:4
---
wallcount = 4
wight, height at 1 times
wight, height at 2 times
进入学期 1,1
WallCount:4
wallcount = 4
wight, height at 1 times
wight, height at 2 times
1,1
---
wight, height at 3 times
wight, height at 4 times
area = 0
你能解释一下吗
- 为什么我的
for loops
运行 第一次 cmd 两次然后 运行 第二次 cmd 然后再次第一次 cmd 两次最后运行最后一个 cmd? - 为什么
area
包含 0?
这里有些地方出了问题。首先,您使用了 %d
,它表示一个整数值,而您使用的是浮点值(使用 %f
)。
这个函数:fmt.Fscanf(r, "%d %d", &width, &height)
returns两个值。第一个值是它成功解析的项目数,第二个值是一个错误。您应该始终检查返回的错误是否不是 nil
,这意味着出现错误:
func main() {
var wallCount int
var width, height, area float64
var r = bufio.NewReader(os.Stdin)
fmt.Print("WallCount:")
fmt.Scanf("%d", &wallCount)
fmt.Printf("wallcount = %v \n", wallCount)
for x := 1; x <= wallCount; x++ {
fmt.Printf("wight, height at %v times\n", x)
_, err := fmt.Fscanf(r, "%f %f\n", &width, &height)
if err != nil {
log.Println(err)
return
}
area += width * height
}
fmt.Printf("area = %v\n", area)
}
在这种情况下,错误非常清楚地描述了错误所在,即:bad verb '%d' for float64
。在 go 中,这种检查错误是否为 nil 的形式非常常见,你应该经常检查你的错误。