求解 C语言题(附带说明 谢谢)
#define PR(ar) printf("%d\n",ar)
main()
{
int j,a[]={1,3,5,7,9,11,13,15},*p=a+5;
for(j=3;j;j--)
{
switch(j)
{
case 1:
case 2: PR(*p++);break;
case 3: PR(*(--p));
}
}
} 展开
#define PR(ar) printf("%d\n",ar)//PR是个打印宏函数
main()
{
int j,a[]={1,3,5,7,9,11,13,15},*p=a+5;//*p等于a+5表示*p指向a[ 5 ],即11
for(j=3;j;j--)//直到j减为0,停止,中间共循环了3次
{
switch(j)//3次循环,分别执行了case 3,case 2,case 1
{
case 1://因为后面没有break,所以继续向后执行
//再次回到case2,此时仍然是使用值后再自加1,但此时使用值已被加1,所以指向了a[ 5 ],即11,然后自加1,遇break结束
case 2: PR(*p++);break;//p++表示使用值后再自加1,所以使用值为上一次的值,即9,然后自加1,遇break结束
case 3: PR(*(--p));//--p表示自减1后再使用值,所以自减后*(--p)指向a[ 5 ]前面那个数,即9,switch结束
}
}
//扩展,此时printf( "%d\n", *p );会输出13
}
main()
{
int j,a[]={1,3,5,7,9,11,13,15},*p=a+5;//定义数组a,指针p指向数组的头+5那个数,也就是11
for(j=3;j;j--) //j=3开始
{
switch(j)
{
case 1://第三次case1没有语句执行case2,先打印,此时p指向11,在移动指针
case 2: PR(*p++);break;//第二次先打印,还是9,然后p+1,后break结束
case 3: PR(*(--p));//第一次执行printf("%d\n",(*--p))也就是先使p-1再打印,就是11的前一个9,然后结束
}
}
}
9
9
11
结束后指针指向13
9
9
11
int *p=a+5;此时p是指向数组a里面的第六个元素11;
进入for循环
j=3,case 3:输出*(--p),p自减一次,指向9,所以输出9;
j=2,case 2:输出*p++,先取值,再自加!所以输出9,break,继续下一次循 环,然后p自加,此时p指向11;
j=1,case 1,什么也没干,接着case 2,就输出11,break,跳出循环!
就是这样子的!
9
11
我也是新手,不知道对不对。感觉是这样