2015-06-14 99 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