一道C语言的题
以下程序的输出结果是()(答案:D)
main()
{ int a,b,t;
for(a=3,b=0;!a=b;a--,b++)
if(a>b){ t=a; a=b; b=t;}
printf("%d,%d\n",a,b);
}
A)4,1 B)1,4 C)4,-1 D)-1,4 展开
#include "悉誉stdio.h"
int Judge(const char *a,const char *b){
int s,n;
for(s=n=0;n<10;s+=a[n]==b[n++]);
return s;
}
int main(int argc,char *argv[]){
const char std[]="ABCDBBCBBC";
char ans[10],i,t;
printf("Please enter your answer(orderly sequence of ABCD)...\n");
while(1){
if(scanf("%10s",ans)==1)
for(i=0;i<10;i++)
if(ans[i]!='A' && ans[i]!='B' && ans[i]!='C' && ans[i]!='D')
break;
if(i>=10)
break;
printf("Input error, redo:\nPlease enter your answer(orderly sequence of ABCD)...\n"竖陆枣);
}
printf("\nCorrect answer:\n");
for(t=Judge(std,ans),i=0;i<10;i++)
if(std[i]==ans[i])
printf("%2d",i+1);
printf("\nTOTAL: %d\n",10*t);
return 0;
}
代码格式和运行样例图余拆片:
for语句中,首先执行a=3,b=0;这轿誉一句,
然后执行!a==b这一句,这是条件判断语句,若为真则执行for循环,若为假,则退出for循环。因为!非运算符的优先级高于==运算符,因此先计算!a,因为a=3,所以!a的值为0,因此!a==b的条件成立,也就是说!a与b的值是相等的。
执行for循环体,执行if,判断a>b是否成立,很明显3>0,因此交换两者的值,这时b=3, a=0;
执行for语句中的a--,b++;因为执行if后a=0, b=3,因此a--之后a的值为-1,b++之后的值为4。
再次执行for语句中的条件语句,!a==b;很明显!a为0,b为4,两者不相等,条件为假,退出for循环。
执行printf语句,输出a和b的值,这里可以看到,a的值为-1,而b的值为此郑4。
注意:for(表达式1;表达式2;表达式3)语句1;
执行顺序是,先执行表达式1,再执行表达式2,若表达式2的值为真,则执行语句1,若为假则跳出循环。执行完语句1之后,再执行表达式3,然后再执行表达式2,判断表达式2的结果是否为真,真则循环,假则退出,如此循环。要注意:表达式1只执行一次。
第一轮凳陵:
for判断语句,!a=b,!a的值为0,因此0=0这个逻辑表达式为真,也就是1
进入if判断,3>禅镇0 ,此时 t=3,a=0,b=3
回到for语句
a--后值为-1,b++后值为4
第二轮:
在此for判断语句,这次!a=b 不成立,因为!a值为0,而b值为4,因此0=4这个逻辑表式为假,也就贺粗粗是0,循环结束
所以打印a b 为 -1 4
{ int a,b,t;//变量定义,a,b,t都为整型
for(a=3,b=0;!a=b;a--,b++)//初始化变量并循环,判断条件是 !a是否等于b(!是隐清逻辑非,搏携兆!0 结果为1 ,!3 结果为0 只要不是0,!之后就为0,是0则为1)
if(a>b){ t=a; a=b; b=t;} // 这里基租执行完a=0,b=3但还要执行上句中的a--,b++,所以a=-1,b=4
printf("%d,%d\n",a,b);//输出
}
a=3,!a=0,b=0,执行,if(a>b),
a(3)>b(0)
a,b交换,b=3,a=0
然后 a--成-1,b++成4,
!a=0,b=4,!a不等于b,跳哗搜出循环,结束
所以a=-1,b=4
!a=b这个地方有举芦首问题
要正数不就是a!=b,要不就是!a==b