我正在检查有关运算符重载的代码,如果第二个变量大于59,我会看到一种使用%将秒转换为分钟的有趣方法。
似乎a<b
(两个int)a%b
返回a,我之前没有读过关于此的规则,我想知道为什么它返回a,是关于它们被声明为整数,是还有关于%的规则吗?
由于
答案 0 :(得分:1)
%
是模运算符。模运算a % b
返回除法中的余数z
a / b = x, remainder z
换句话说,它在此等式中返回y
:
x * b + y = a
*第二个等式也说明了为什么它也适用于小数。**
因此,以下示例(未完成)为真:
-5 % 4 = -1
-4 % 4 = 0
-3 % 4 = -3
...
1 % 4 = 1
2 % 4 = 2
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1
...
101.4 % 100.3 = 1.1
在您将秒转换为分钟和秒的示例中,您可能会阅读如下内容:
int totalseconds = 72;
int minutes = totalseconds / 60; // == 1
int seconds = totalseconds % 60; // == 12
这是同一件事:minutes
计算为totalseconds / 60
,这是一个整数除法,“舍入”为正整数的较低整数,因此1
的结果。剩余的秒数计算为72
和60
的剩余部分。
你也可以像
一样计算秒数int seconds = totalseconds - (minutes * 60)
答案 1 :(得分:0)
a mod b
是a / b
的剩余部分,因此如果a < b AND a > -b
余数始终为a
。
以下规则对C#有效,但在其他语言中可能有所不同,请参阅Modulo operation page on Wikipedia以获取更多信息。
0 mod 3 = 0
1 mod 3 = 1
2 mod 3 = 2
3 mod 3 = 0
4 mod 3 = 1
-1 mod 3 = -1 // 2 in some languages
-2 mod 3 = -2 // 1 in some languages
-3 mod 3 = 0
-4 mod 3 = -1 // 2 in some languages
// if your language supports mod of floats
1.5 mod 3 = 1.5
5.5 mod 3 = 2.5
-1.5 mod 3 = -1.5 // 1.5 in some languages
-5.5 mod 3 = -2.5 // 0.5 in some languages
答案 2 :(得分:0)
一般情况下,对于任何a
和任何b
:
a / b =(SomeConstant * b)+ RemainderOfb *
因此,如果a = 2
和b = 5
表示a < b
,那么:
为了接近一个,你需要多少个SomeConstant乘以b?一旦你接近,剩下的是什么?
所以,如果
a / b = (5 * 0) + 2
表示剩余= 2 超出5个。
然后:a % b
表示与b
相关的余数,即= 2.
如果a = 3
和b = 2
表示a > b
,那么:
如果你从a中删除了所有&#34; b&#34; s,什么是剩余?你可以做 这很简单:减去&#34; a&#34;来自&#34; b&#34;直到你无法减去 了。或者:
a / b = SomeConstant * a (which is how many "a"s did you subtract) + Remainder
替换:
a / b = (1 * 2) + 1
意味着2
中的剩余= 1然后a % b
等于余数与a
相等,即= 1