Golang中这两段代码有什么区别?

Golang中这两段代码有什么区别? 第一个:

package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
var sum int
for i:=0; i<=n; i++ {
switch i%2 {
case 0:
fmt.Println(i, "even!")
case 1:
continue
}
sum += i
}
fmt.Println("Sum =", sum)
}

第二个:

package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
var sum int
for i:=0; i<=n; i++ {
switch i%2 {
case 0:
fmt.Println(i, "even!")
case 1:
break
}
sum += i
}
fmt.Println("Sum=", sum)
}

如果可以的话,请根据这个例子简要解释一下 breakcontinue 的含义,谢谢。


更多关于Golang中这两段代码有什么区别?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

我思考了一个乘法运算,9*5=45,但它是如何运作的呢?

更多关于Golang中这两段代码有什么区别?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你运行过不同的代码吗?是否观察到行为上的任何差异?

是的,我不知道这是什么意思。如果我输入9,第一个程序显示的和是20,而第二个程序显示的是45……我想这是乘法运算(?)

20 和 45?对于 9?

我原本期望第一段代码显示总和为 20,第二段代码显示总和为 0……

每个版本打印一个数字后跟“even”的频率是多少?

尽管我现在很难真正推理这段代码。我正使用移动设备,无法运行它。同时,缺少格式使得代码难以阅读……

第五,输出如下:

C:\Users\Ilenia\go\src\esercitazioni\lab5 esempio>go run "es 2.go"
9
0 even!
2 even!
4 even!
6 even!
8 even!
Sum = 45

好的,我首先需要理解 break 在这种情况下的语义。

我最初假设 break 是与循环绑定的,但实际上它是与 switch 绑定的,并且允许存在一个否则就是空的分支。

所以第二个版本只是对 0 到 9 进行求和,而第一个版本中的 continue 会导致当前循环迭代在此处停止,并“继续”下一个迭代,而不执行此后的代码。因此,这里只对 0 到 9 之间的偶数进行求和。

这是第一段代码:

package main

import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	var sum int
	
	for i := 0; i <= n; i++ {
		switch i % 2 {
		case 0:
			fmt.Println(i, "even!")
		case 1:
			continue
		}
		sum += i
	}
	
	fmt.Println("Sum =", sum)
}

这是第二段代码:

package main

import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	var sum int

	for i := 0; i <= n; i++ {
		switch i % 2 {
		case 0:
			fmt.Println(i, "even!")
		case 1:
			break
		}
		sum += i
	}

	fmt.Println("Sum=", sum)
}

这两段代码都实现了预期的功能:一个打印66,另一个打印30。这是因为 break 只会退出 switch 语句,而 continue 会继续执行 for 循环。

这两段代码的核心区别在于 continuebreakswitch 语句中的行为不同。

第一段代码(使用 continue):

  • i%2 == 1(奇数)时,执行 continue,这会跳过当前循环的剩余部分,直接进入下一次循环迭代。
  • 因此,奇数不会执行 sum += i,但循环会继续处理下一个 i
  • 最终 sum 累加的是所有偶数。

第二段代码(使用 break):

  • i%2 == 1(奇数)时,执行 break。这里的 break 属于 switch 语句,只会跳出 switch,而不会跳出 for 循环。
  • 因此,奇数仍然会执行 sum += i,循环也会继续。
  • 最终 sum 累加的是所有数(包括奇数和偶数)。

实际上,在这个例子中,switch 里的 break 是多余的,因为 switch 默认就会在匹配的 case 执行完后跳出。所以第二段代码的效果等同于删掉整个 switch 语句。

简单来说:

  • continue 跳过本次循环的剩余代码,直接开始下一次循环。
  • breakswitch 中只跳出 switch;在 for 中才会跳出整个循环。

示例验证: 假设输入 n = 3

第一段代码输出:

0 even!
2 even!
Sum = 2

(只累加了偶数 0 和 2)

第二段代码输出:

0 even!
Sum= 6

(累加了 0, 1, 2, 3,但只打印了 0 的 “even!”)

关键点:switch 内部,break 并不会影响外层的 for 循环。如果想用 break 跳出外层循环,需要配合标签使用,例如:

loop:
for i := 0; i <= n; i++ {
    switch i % 2 {
    case 1:
        break loop // 跳出整个 for 循环
    }
    sum += i
}
回到顶部