C++ 取余(对标 Python 中第二个操作数为非 0 整数或浮点数的 % 运算符运算)

不知道大家有没有注意到,C/C++ 的 % 运算符和 Python 的 % 运算符存在差异,且差异较大。从数学角度来讲,我们都知道 9 % 5 = 4,这在 C/C++ 和 Python 中的 % 运算都是成立的。然而,当我们把 9 换成 -9 后,情况就变了。从数学(数论同余)的角度来讲,(-9) % 5 的结果应该是 1,这在 Python 的 % 运算中依旧成立,而在 C/C++ 中,这一情况似乎发生了变化,它的运算结果为 -4,给人的感觉是 -(9 % 5)。没错,它确实是 -(9 % 5)。有人可能会说“你是不是忘记写括号了,% 的运算优先级高于 -”。事实上,在 C/C++ 中,无论是 cout << -9 % 5 << endl;printf("%d\n", -9 % 5);) 还是 cout << (-9) % 5 << endl;printf("%d\n", (-9) % 5);),结果都是 -4(回车)。在 Python 中,无论是 print(-9 % 5) 还是 print((-9) % 5 还是print(- 9 % 5)(“-”后面多了个空格),结果都是 1。此处,“-”是负号,送给 % 运算符的两个操作数分别为 -95,因此,结果为 1。更多地,我们有 print(0 - 9 % 5),这时,括号内表达式的含义是“用 0 减去 9 % 5 得到的结果”,此处的 - 是个减号,因运算优先级低于 %,所以出来的结果是 -4。更多地,我们有:

表达式 数学意义上 Python C/C++
9 % 5 4 4 4
-9 % 5 1 1 -4(可通过 +5 修正)
9 % -5 (没学过) -1 4(可通过 -5 修正)
-9 % -5 (没学过) -4 -4

Python
C++
观察可知,当出现负数时,% 运算符在 C/C++ 中可能会产生不期望的结果。查阅部分网上资料说有 fmodremainder 函数,据说还有区别(fmod 函数会和第一个操作数同号而 remainder 函数会和第二个操作数同号),但实践中未发现区别。感觉这两个函数直接就是 % 的浮点支持版本,同样,部分运算结果不是我们期望的结果。
C++
Python
Python 的 % 不仅支持整数,同时还支持浮点数,可以做到一个 % 就可以贯穿整数和浮点数。所以,我们来做个简单的对标。当第二个操作数为非 0 整数或浮点数时,用 C/C++ 手动实现一个取余运算。分析可知,我们有:

aaa bb<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值