我正在尝试理解我正在调试的这个函数:
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,这是如何工作的。
答案 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:在下一次分配或比较之前,增量前递增值,其中在执行赋值/比较后,后递增值。
相关问题:
答案 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)。