Golang中这段代码是如何运行的?

Golang中这段代码是如何运行的? Go Playground - Go 编程语言

我不清楚这段代码是如何从函数参数中计算每个单独数字的:

for number != 0 {
	digit := number % 10
	number /= 10
	fmt.Printf("%d ", digit)
}

number % 10 是什么意思? 还有这个 number /= 10 是什么意思?

5 回复

%模数余数运算符

这里需要谨慎,它们并非可互换的。在 Go 语言中,% 实际上是求余运算,而非模运算。因此,在 Go 中,5 % 45 % -4 的结果都是 1;而如果你在 Google 中尝试 5 modulo (4)5 modulo (-4),你会得到 1-3,这正是模运算预期的结果。

更多关于Golang中这段代码是如何运行的?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


确实如此,不同语言在处理甚至命名这些运算时存在差异,尽管许多遵循C语言惯例的语言在使用%时明确表示是取余数,甚至直接称之为余数运算。其他语言则明确提供remmod函数/方法来区分两者的不同。尽管如此,争议和困惑依然存在。但抛开命名不谈,我认为最重要的是了解所用语言的实际行为,以避免因此出现问题,例如在移植代码时。

这里有一篇简短的文章探讨了这个问题,并包含一些指向其他资源的有趣链接。

%取模取余运算符。其结果为除法运算后的余数。示例如下:

10 % 7 = 3(因为 7×1 + 3 = 10)
5 % 2 = 1(因为 2×2 + 1 = 5)
23 % 7 = 2(因为 3×7 + 2 = 23)

number % 10 用于获取数字的个位数。示例如下:

38746 % 10 = 6
8349 % 10 = 9
23 % 10 = 3

关于第二个问题:

number /= 10

是以下写法的简写形式:

number = number / 10

(两者几乎完全相同,但并非完全等价,因为在第二种情况下,如果 number 是一个表达式,它会被计算两次。)

感谢你的纠正!我应该用"余数"而不是"模数"。

你提出了一个很好的观点,因为不同的编程语言以不同的方式实现余数运算符(在其他语言中可能称为模数或模运算)。我正在阅读这篇维基百科文章:

图片

模运算

在计算中,模运算找到一个数除以另一个数后的余数(有时称为模数)。给定两个正数,a(被除数)和n(除数),a模n(缩写为a mod n)是a除以n的欧几里得除法的余数。例如,"5 mod 2"的结果为1,因为5除以2的商为2,余数为1;而"9 mod 3"的结果为0,因为9除以3的商为3,余数为0…

我意识到长期以来我一直在忽略某些东西,因为Go的余数运算符的工作方式与我习惯使用的JavaScript、Bash和C(ISO 1999标准)中的相同。

随着Go的日益普及,特别是在Web开发和云计算领域,许多现有应用程序正在用Go重写。因此,当从其他编程语言转向Go时,这是一个需要注意的重要细节。

这段代码通过取模和整数除法来分解一个整数的各个数字。让我详细解释每个部分:

for number != 0 {
    digit := number % 10  // 获取当前数字的个位数
    number /= 10         // 将数字除以10,去掉个位数
    fmt.Printf("%d ", digit)
}

number % 10 的含义:

  • % 是取模运算符,返回除法的余数
  • number % 10 获取数字的个位数
  • 例如:123 % 10 = 345 % 10 = 5

number /= 10 的含义:

  • /= 是除法赋值运算符,等价于 number = number / 10
  • 由于是整数除法,结果会截断小数部分
  • 例如:123 / 10 = 1245 / 10 = 4

完整示例:

package main

import "fmt"

func main() {
    number := 12345
    
    fmt.Printf("分解数字 %d: ", number)
    for number != 0 {
        digit := number % 10
        number /= 10
        fmt.Printf("%d ", digit)
    }
    // 输出: 分解数字 12345: 5 4 3 2 1 
}

执行过程:

  1. 初始:number = 12345
  2. 第一次循环:digit = 12345 % 10 = 5, number = 12345 / 10 = 1234
  3. 第二次循环:digit = 1234 % 10 = 4, number = 1234 / 10 = 123
  4. 第三次循环:digit = 123 % 10 = 3, number = 123 / 10 = 12
  5. 第四次循环:digit = 12 % 10 = 2, number = 12 / 10 = 1
  6. 第五次循环:digit = 1 % 10 = 1, number = 1 / 10 = 0
  7. 循环结束

这样就从右到左依次提取了数字的各个位数。

回到顶部