C语言 循环体结构 解释 5

在下列选项中,没有构成死循环的程序段是
A) int i=100;
while (1)
{ i=i%100+1;
if (i>100) break;
}
B) for( ; ; );
C) int k=1000;
do {++k;} while (k>=1000);
D) int s=36;
while (s) --s;
D
能把对错详细的解释下吗

A中,对于int i=100;i=i%100+1;循环变量i的更新为i对100取余+1。任何整形对于N取余的结果都在[0,100)之间,就算+1,i也永远不会大于100,故为死循环。
B.典型的死循环,没有循环变量控制,循环体内部是空语句 只有一个空语句“ ; ”。这是一个不做任何操作的死循环。
C.这道题的bug恐怕就在选项C了。从出题人的意思来看,k初始值是1000。do while的特点是每做一遍循环体中的内容{++k;},然后再检查循环条件(k>=1000)。循环体++k第一次运行之后,k已经大于1000了,满足循环继续下去的条件。所以出题人认为,在后续的循环过程中,k不断的自增,k永远不会小于1000。所以出题人认为这个也是个死循环。
D.s被初始化为36,每次循环都执行一次--s,s的内容会自减1.while(s)的意思就是当s非零的时候,执行循环体。s是每次循环自减的,从36开始自减,执行36次之后,s就为0了,不再满足循环条件。于是循环是可以结束的,不是死循环。

注:
1.while(exp){stat;}
a)检查exp的值
b)当表达式exp为非零值, 执行循环体中的语句stat,并回到a);当表达式exp的值为0,终止循环 。
2.do{stat;}while(exp);
a)执行循环体语句stat,然后检查exp的值;
b)如果exp的值非零,则回到a)继续循环;如果exp为零,终止循环
3.for(exp1; exp2;exp3){stat;}
a)循环体第一执行前,先执行exp1;
b)检查exp2的值,如果exp2非零做c);如果exp2为零,终止循环;
c)执行循环体中的stat语句,然后执行exp3,再回到b)

p.s.这个出题人在题中的选项C翻了一个错误,其实有符号的整形int在自增到int能表示的正最大值之后继续自增会变成int能表示的负最小值。这种行为叫做int的溢出。所以k会在自增的过程中突然变成负值,小于1000了,循环会终止。但终止的原因如我所述,而不是逻辑上期待的终止方式。详细的情况,感兴趣的话去翻翻书或者问问老师,问我也可以……
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-29
A i=i%100+1; i永远不会大于100,所以if语句不可能成立,死循环打破不了。

B for语句没有结束条件,所以也是死循环;

C k初始值为1000, 当k>=1000是,k递增,所以会一直往上增加,构成死循环;

D s初始值为36;当s>0时s递减,所以最后能减到s值为零,结束循环。本回答被网友采纳
第2个回答  2010-12-29
我觉得是A
第一次执行完后i为1,每一次都加1,但是到99次时i=100,100次时i又回到1,只有当i大于100(够101时)才会跳出循环,所以死循环
B应该会提示出错的吧,无法编译
C到K溢出时会是负值,不满足K大于等于1000,跳出循环
D当S减到0的时候就跳出循环(0是假,除0以外所有值都是真)
相似回答