Golang中这段代码是如何运行的?
%是模数或余数运算符
这里需要谨慎,它们并非可互换的。在 Go 语言中,% 实际上是求余运算,而非模运算。因此,在 Go 中,5 % 4 和 5 % -4 的结果都是 1;而如果你在 Google 中尝试 5 modulo (4) 和 5 modulo (-4),你会得到 1 和 -3,这正是模运算预期的结果。
更多关于Golang中这段代码是如何运行的?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
确实如此,不同语言在处理甚至命名这些运算时存在差异,尽管许多遵循C语言惯例的语言在使用%时明确表示是取余数,甚至直接称之为余数运算。其他语言则明确提供rem和mod函数/方法来区分两者的不同。尽管如此,争议和困惑依然存在。但抛开命名不谈,我认为最重要的是了解所用语言的实际行为,以避免因此出现问题,例如在移植代码时。
这里有一篇简短的文章探讨了这个问题,并包含一些指向其他资源的有趣链接。
% 是取模或取余运算符。其结果为除法运算后的余数。示例如下:
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 = 3,45 % 10 = 5
number /= 10 的含义:
/=是除法赋值运算符,等价于number = number / 10- 由于是整数除法,结果会截断小数部分
- 例如:
123 / 10 = 12,45 / 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
}
执行过程:
- 初始:number = 12345
- 第一次循环:digit = 12345 % 10 = 5, number = 12345 / 10 = 1234
- 第二次循环:digit = 1234 % 10 = 4, number = 1234 / 10 = 123
- 第三次循环:digit = 123 % 10 = 3, number = 123 / 10 = 12
- 第四次循环:digit = 12 % 10 = 2, number = 12 / 10 = 1
- 第五次循环:digit = 1 % 10 = 1, number = 1 / 10 = 0
- 循环结束
这样就从右到左依次提取了数字的各个位数。


