了解 For 循环中的模数

Understanding Modulus on For Loop

我正在尝试理解我正在调试的这个函数:

static int a = 1;

static int[] functionModulus(int n)
{
    for (; n % ++a > 0; ) ;
    return new[] {n = n/a + a >> 1, n - a};
}

基本上这个函数是获取输入的计算,并将 return 一个包含两个元素的数组,使得 a^2 - b^2 = n(输入 n)。因此,n = 15 的输入将 return 4 和 1,因为 4^2 - 1^2 = 15。

不用管计算,我想知道这条线是如何工作的:

for (; n % ++a > 0; ) ;

调试的时候,一开始a的值为1,我输入的n=15。

当然a在函数外被初始化为1而15是我输入的n。我不解的是跳出for循环后,a的值变为3?怎么变成3? 15 mod of 3 不大于0?我试过把n改成21,跳出for循环后a还是变成了3?我真的不明白它是如何增加到 3 的,它是如何工作的。

for (; n % ++a > 0; ) ;

等同于

for (; n % (a + 1) > 0; a++) ;

a++;

// n % a == 0

模数运算符returns整数除法后的余数。

您可以将运算符 x % y 写成

result = x;
while (result >= y)
{
    result -= y;
}
return result;

在这种情况下 15 % 3 为零。

15%3 等于 0 并且不满足大于 0 的条件,这导致 for 循环终止并且 a 的值停留在 3。

for循环条件执行两次,一次为2(表达式左边为1),一次为3(表达式左边为0)。

让我们分析一下这段代码:

static int[] functionModulus(int n)
{
    for (; n % ++a > 0; ) ;
    return new[] {n = n/a + a >> 1, n - a};
}

这里有2个循环:

(1) a = 1,预先增加 ++a 即 returns 2,然后 15 % 2 > 0 - 循环继续。

(2) a = 2,预先增加 ++a 即 returns 3,然后 15 % 3 = 0 - a 值现在已经是 3 &循环在这里停止。数组结果为 4 & 1,这是正确的 (4^2 - 1 = 15).

如果我们将预增量更改为 post-增量,如下所示:

for (; n % a++ > 0; ) ;

循环执行3次如下:

(1) a = 1,然后 15 % 1 > 0 - 循环继续 & a 将 post-使用 a++ 增加到 2.

(2) a = 2,然后 15 % 2 > 0 - 循环继续 & a 将 post-使用 a++ 增加到 3.

(3) a = 3, then 15 % 3 = 0 - 循环到此停止,并且 a 值仍为 2。数组结果为 4 & 2,即不正确 (4^2 - 2^2 = 12).

所以模数部分没有问题,这取决于值增量部分的工作方式。

结论: pre-increment & post-increment 在循环中使用可能会returns不同的结果,这里有pre-increment(++a) 优先于 post-increment (a++) 这里。

NB:pre-increment增量值before下一次赋值或比较,其中post-increment增量值执行assignment/comparison.

之后

演示:.NET Fiddle Example

相关问题:

What is the difference between i++ and ++i?