以下程序的输出结果是

以下程序的输出结果是 _____。
#define PR(ar) printf("ar=%d ",ar)
main()
{ int j,a[]={1,8,3,7,6,13,17,15},*p=a+5;
for(j=3;j;j--)
switch(j)
{ case 1:
case 2:PR(*p++);break;
case 3:PR(*(--p));
}
}请给出答案和详细解释。

int main()
{
int j;
int a[]={1,3,5,7,9,11,13,15};
int *p=a+5; //p指向数组元素11
for(j=3;j;j--) { //j从3开始到1,循环三次
switch(j) {
case 1: //如果j==1,动作和j==2相同
case 2: printf("%d\n", *p++); break; //先打印p指向的数组元素,再把p指向后面一个元素
case 3: printf("%d\n", *(--p)); break; //先把p指向前面一个元素,再打印p指向的元素
}
}
return 0;
}
j==3时,--p,p指向9,打印9
j==2时,p指向9,打印9,然后p++,p再指向11
j==1时,p指向11,打印11,然后p++,p再指向13
所以输出结果为:
9
9
11
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-25
#define PR(ar) printf("ar=%d ",ar)这是一个宏定义用前面的代表后面的输出语句*p=a+5指针p指向数组啊中的第六个元素也就是13for(j=3;j;j--)由于没有范围限制,所以这个是个无限的自减循环
switch(j)
{ case 1:
case 2:PR(*p++);break;
case 3:PR(*(--p));
这是根据j 的值输出相应值的语句当j=3时执行case 3:PR(*(--p));先执行括号里面的--p使p指向数组a 的第五个元素6在输出,结果为6当j=2时执行case 2:PR(*p++);break;因为++的优先级比*高所以先执行p++即先用p在给p加1,所以这次的结果依然为6,再执行后面的break;语句跳出循环当j=1时执行case 1:语句,由于该语句后面为空且没有break中断,所以向下执行case 2:PR(*p++);break;由于上个循环时p的值加了1即指向数组a 的第六个元素,所以输出13