2015-10-18 101 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

謝謝。現在很容易理解。 –

相關問題