2015-10-18 144 views
-4
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循环在这里如何工作?它不遵循我所看到的语法。有人可以帮我理解这个“for”循环是如何工作的吗?

+3

为什么你关心混淆代码? – EOF

+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循环只是执行一个初始表达式,执行条件检查并在每次迭代后执行后续处理。

+0

谢谢。现在很容易理解。 –

相关问题