Bol*_*ock 27
%给你一个除法的余数,并完全丢弃商,同时DivRem()计算并返回两者的商和余数.
如果您只关心两个整数之间的余数,请使用%:
int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
Run Code Online (Sandbox Code Playgroud)
如果您需要知道在余数为1之前10被除以3的次数,请使用DivRem(),返回商并将余数存储在out参数中:
int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient); // 3
Console.WriteLine(remainder); // 1
Run Code Online (Sandbox Code Playgroud)
这是一个优化.某些处理器能够同时计算这两个值.其他处理器不能分为硬件(并且必须使用非常慢的软件例程).
在任何一种情况下(除非你有一个智能编译器),你最终可以计算两次相同的部门.由于在任何处理器上(即使在硬件中实现),分区永远不会很快,因此使用Math.DivRem可以为JIT提供一个很好的"提示"来仅计算一次值.
iirc Mono没有实现这种优化,我甚至不确定MS是否这样做.
小智 6
它可能是一个优化,但不幸的是产生与分区相同的IL PLUS mod操作.
在典型的体系结构(x86和朋友)上,两者可以从单个操作中获得,但.NET JIT似乎没有优化(在我的测试中).
所以以下两个是等价的:
quotient = Math.DivRem(10, 3, out remainder);
Run Code Online (Sandbox Code Playgroud)
VS:
quotient = 10 / 3;
remainder = 10 % 3;
Run Code Online (Sandbox Code Playgroud)
除了后者更具可读性.
为了记录这个丑陋的选项在x86和x64上更快:
quotient = 10 / 3;
remainder = 10 - (3*quotient);
Run Code Online (Sandbox Code Playgroud)
希望JIT有一天会改进,将两个操作优化为一个,因为它是微不足道的.