chai2010/advanced-go-programming-book

ch3.5 控制流 - for例子有错误

chai2010 opened this issue · 2 comments

哪位感兴趣的可以帮忙修改下,谢谢

171页第一个代码段改为:

func LoopAdd(cnt, v0, step int) int {
	result, vi := 0, v0
	for i := 0; i < cnt; i++ {
		result, vi = result+vi, vi+step
	}
	return result
}

改动的代码有2行:

  1. result := v0改为result, vi := 0, v0
  2. result += step改为result, vi = result+vi, vi+step

171页第二个代码段改为:

func LoopAdd(cnt, v0, step int) int {
	var vi = v0
	var result = 0

// LOOP_BEGIN:
	var i = 0

LOOP_IF:
	if i < cnt { goto LOOP_BODY }
	goto LOOP_END

LOOP_BODY:
	i = i+1
	result = result + vi
	vi = vi + step
	goto LOOP_IF

LOOP_END:

	return result
}

改动的部分:

  1. var i = 0改为var vi = v0
  2. LOOP_BEGIN:变成注释,其后的代码改为var i = 0
  3. LOOP_BODY中result = result + step改为result = result + vi
  4. LOOP_BODY中增加一行vi = vi + step

第三个代码段改为:

#include "textflag.h"

// func LoopAdd(cnt, v0, step int) int
TEXT ·LoopAdd(SB), NOSPLIT,  $0-32
	MOVQ $0, BX          // result
	MOVQ cnt+0(FP), AX   // cnt
	MOVQ v0+8(FP), DI    // vi = v0
	MOVQ step+16(FP), CX // step

LOOP_BEGIN:
	MOVQ $0, DX          // i

LOOP_IF:
	CMPQ DX, AX          // compare i, cnt
	JL   LOOP_BODY       // if i < cnt: goto LOOP_BODY
	JMP LOOP_END

LOOP_BODY:
	ADDQ DI, BX          // result += vi
	ADDQ CX, DI          // vi += step
	ADDQ $1, DX          // i++
	JMP LOOP_IF

LOOP_END:

	MOVQ BX, ret+24(FP)  // return result
	RET

以上三个代码段其实是同一个程序的不同版本,他们的改动都是相同的问题。

刚好看到这里啦~ 照着改一下书上的例子 😝