理解For循环的模数

时间:2017-07-12 02:28:35

标签: c# for-loop modulus

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

static int a = 1;

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

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

没关系计算,我想知道这条确切的线是如何工作的:

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

调试时,a开头的a值为1,输入的n = 15。

当然 a在函数外部初始化为1 和15是我输入的n。我感到困惑的是在退出for循环后, a的值变为3?它是如何成为3? 15 mod的3不大于零?我试图将n更改为21,并且在执行for循环后仍然变为3?我真的不明白它如何增加到3,这是如何工作的。

4 个答案:

答案 0 :(得分:2)

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

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

这里有2个循环:

(1)a = 1,预先递增++a,返回2,然后15%2> 0 - 循环继续。

(2)a = 2,预先递增++a,返回3,然后15%3 = 0 - a值现在已经是3&循环在这里停止。阵列结果为4& 1,这是正确的(4 ^ 2 - 1 = 15)。

如果我们将预增量改为后增量,如下所示:

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

循环执行3次如下:

(1)a = 1,然后15%1> 0 - 循环继续& a将使用a++后递增至2。

(2)a = 2,然后15%2> 0 - 循环继续& a将使用a++后递增至3。

(3)a = 3,然后15%3 = 0 - 循环在此停止,a值仍为2.数组结果为4& 2,这是不正确的(4 ^ 2 - 2 ^ 2 = 12)。

因此模数部分没有任何问题,它取决于增值部分的工作原理。

结论:预增量&在循环中使用后增量可能会返回不同的结果,这里的预增量(++a)优先于后增量(a++)。

NB:在下一次分配或比较之前,增量前递增值,其中在执行赋值/比较后,后递增值

演示:.NET Fiddle Example

相关问题:

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

答案 1 :(得分:1)

该行

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

相当于

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

a++;

// n % a == 0

答案 2 :(得分:1)

模数运算符在整数除法后返回余数。

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

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

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

答案 3 :(得分:1)

15%3等于0且未通过大于0的条件这导致for循环终止并且a的值停留在3。

for循环条件执行两次一次为2(表达式的左手等于1)和一次为3(表达式的左手等于0)。