2015-06-14 124 views
-5
int main() 
{ 
    int N, K, i, j, k, x, final, cur, A[22]; 

    for(i=!!scanf("%d %d",&N,&K), printf("%d\n",(final=N*N)-N);i<=N;A[i++]=i); 
    for(i=(cur=N)-1; i>=1; i--) 
    for(j=1; j<=i; printf("%d %d min\n%d %d max\n",A[j],A[j+1],A[j],A[j+1]),A[j]=++cur, A[j+1]=++cur, j++); 
    for(printf("%d",final-1+(cur=final)*0+(x=2)*0); cur>N; printf(" %d",cur), cur-=x, x+=2); 
    return 0; 
} 

請解釋在第一個「for」語句中使用2個感嘆號。請解釋一下代碼?

+2

你知道C中單個感嘆號的含義嗎? (修辭問題,如果你不這樣做,你應該閱讀你的基本C)現在申請兩次! – usr2564301

+0

單個感嘆號「!」意味着採取邏輯NOT,所以申請。所以它的值將是0或1.取決於scanf的返回值。做'man scanf'來找出更多關於它的信息。當它返回應該告訴哪兩個的成功/失敗!意思。 – gabhijit

+1

該代碼需要格式化,它不是所有可讀的。我現在會做,但請記住它之後。 –

回答

0

我只是首先解釋循環,最後3個循環很容易理解。 一步一步的解釋。

步驟1:

for(i=!!scanf("%d %d",&N,&K), printf("%d\n",(final=N*N)-N);i<=N;A[i++]=i); 

這裏,scanf("%d %d",&N,&K)返回(成功讀取整數的數。)2

步驟2:單否定,!2 = 0,現在否定這個0,!0 = 1。所以,i = !!2 = 1

步驟3:假設你的輸入是3 5 [N = 3,K = 5]。這樣的printf("%d\n",(final=N*N)-N)輸出將是final = (3*3)-3 = 6

步驟4:檢查條件:i<=N裝置,被1 < = N?如果是,則該循環繼續,直到條件變爲假。在A[i++] = i的過程中,首先設置A的索引i,然後i增加1,然後將A [i]的值設置爲i。所以最後你會得到如下數組:

A[1] = 2; 
A[2] = 3; 
A[3] = 4; 
0

第3步:假設你的投入是3 5 [N=3, K=5]。因此printf("%d\n",(final=N*N)-N)的輸出將爲(final = (3*3)-3) = 6(output) ,final =6