有人可以帮我理解这个"对于"循环工作?

时间:2015-10-18 17:43:24

标签: c loops for-loop

int main(void) {
    long fall, n, k, p, i, j, r;
    long long x, y, a[110][110];
    for(a[0][0]=scanf("%ld",&fall);fall--;printf("%lld\n",y)) {
        for(i=!!scanf("%ld%ld%ld",&n,&k,&p);i<=k+1;i++)
            for(j=0;++j<=i;a[i][j]=(a[i-1][j-1]+j*a[i-1][j])%p)
                ;
        for(y=!(j=1);j<=k+1;y=(y+a[k+1][j++]*x)%p)
            for(x=!((r=n%j)*!(i=-1));++i<j;x=x*(n-i)/((i==r)?j:1)%p)
                ;
    }
    return 0;
}

for循环如何工作?我看到它并没有遵循语法。

1 个答案:

答案 0 :(得分:1)

for循环具有以下模式:

for(initial expression; conditional expr; afterthought)

我会为你打破第一个循环,你应该能够自己完成剩下的工作。

for(a[0][0]=scanf("%ld",&fall);fall--;printf("%lld\n",y))

此循环的初始化部分为a[0][0]=scanf("%ld",&fall)scanf用于读取输入并返回输入值的数量。在这种情况下,它将为1,并将其分配给a[0][0]

fall--是条件表达式。在C中,正数被评估为真。所以这个循环将一直运行到fall == 0

printf("%lld\n",y)是事后的想法。它在每次循环迭代后运行。在这种情况下,它只会打印值。

解开混淆代码可能是一个很好的学习练习,但显然你必须在实践中使用它。

此代码滥用了for循环的第一个和第三个条件不一定需要与循环本身有任何关系的事实。从本质上讲,for循环只执行初始表达式,执行条件检查并在每次迭代后执行事后补充。