再问一道C语言的问题。请高手解答!

来源:百度知道 编辑:UC知道 时间:2024/05/14 06:46:33
2006年9月二级C笔试第23题:
有以下程序
main()
{int i;
for(i=1;i<=40;i++)
{if(i++%5==0)
if(++i%8==0) printf("%d",i);
}
printf("\n");
}

执行后的输出结果是
A)5 B)24 C)32 D)40

我觉得是40。
请指出答案,并讲解一下为什么选这个答案。
照这么说24也可以呀,i=20时,可以被5整除,自加1到24,可以被8整除。其它很多数都可以,为什么就唯独是32呢?

答案是C,32
i=30时,if(i++%5==0)判断完了后自加了1,i=31,在接下去的if(++i%8==0)的判断时,i先自加了1,再进行了判断,i=32满足条件因此打印输出32

i=40时,作了i++%5==0后i的值 变成了41,不满足后面的++i%8==0,所以不可能输出 40

唉,大伙儿为什么不追踪一下i在循环开始的值呢?
1
3
5
8
10
13
15
18
20
23
25
28
30
#32//被打印出来的那个,这样结果一目了然了
33
35
38
40

i=20时,可以被5整除,自加1到24,可以被8整除——这里问题就来了,你那个i==20时,怎么能自加到24呢?
赫赫,还有,楼上newghost说的那个等价,不甚准确啊,原来是带自加的,i的值会改变。

i++ % 5 == 0 ; ++i % 8 == 0;
相当于 i % 5 == 0 && (i+2) % 8 == 0

该程序可看为
main()
{int i;
for(i=1;i<=40;i++)
{
if(i++%5==0)
{
if(++i%8==0)
{ printf("%d",i); }
}
}
printf("\n");
}

该程序考查的是“++”放在变量前与后的区别
放在前面是先自加1后运算
放在后面是运算后再自加1
所以此程序求出的是从1到40能整除5
加2后能整除8的数
这个数应该是30
但显示的是加完2后的数
那么也就是32

这道题目也许只有一个一个手工推算才能得出结论了,问题并没有楼主说的那么简单,因为在if过程中即使判断失败i