
11
A
解析
x=12
,则
y=x>12x+10:x-12
==>表达式
x>12为假,y=x-12=12-12=0
12
B
解析
while语句格式如下所示:
while(<循环条件>)
{<循环体>;}
程序执行到while时:1判断while后的循环条件;2当<循环条件>为真时,执行<循环体>;3当<循环条件>为假时,不执行<循环体>,跳出while语句段;4重复1-3步骤。
while(k=0),因为k=0是一个赋值表达式,它为永真,所以表达式
k=0总是为真,而循环体内没有break,故循环体执行无数次。
13
A
解析当(!E)为真,则执行循环体,此时E为假;当(!E)为假,则不执行循环体,此时E为真;即E为假时执行循环体,E为真时不执行循环体;
故while(!E)与while(E==0)时等价的,都是E为假时执行循环体,E为真时不执行循环体。
14
C
解析
n++<=2,先判断n<=2,在自加1while的循环体是一个空语句";",
1n=0
,n++<=2==>0<=2,n=1;
2n=1
,n++<=2==>1<=2,n=2;
3n=2
,n++<=2==>2<=2,n=3;
4n=3
,n++<=2==>3<=2为假,跳出循环,n=4;
故printf()时n=4
15
A
解析
dowhile格式:
do
{<循环体>;}
while(<循环条件>);
它是先执行一次后再判断,while是先判断在执行。故do-while的循环体至少无条件执行一次
,而while可能一次也不执行。
16
C
解析
第一次执行的时候,x=(-1)(-1)=1,判断(!x)为假,跳出循环。故只执行1次。
17
D
解析
A,B显然不正确。在do-while循环体中有break语句是照样可以跳出循环。
18
B
解析
TC20执行
19
D
解析
TC20执行
20
D
解析
显然!
执行10次,因为k的减1 *** 作是在循环体内做的,如果改成while(--k == 1),则循环9次;
补充:while(k=1)错了,=是赋值 *** 作,==才是逻辑判断,如果是你那样的话就是无限循环了
c,一次也不执行
while括号内是表达式k=0,而k=0表达式的值就是0(因为k=0,所以这时k为0,这个表达式的值也为0)
0则条件不满足(为假,while为真时才进行循环)所以不执行循环体
于是就一次循环也不会执行了
这是一个没有意义的问题
先看下面C99标准文档的叙述:
C 语言标准对副作用和序列点的定义如下:
Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment Evaluation of an expression may produce side effects At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place
翻译如下:
访问易变对象,修改对象或文件,或者调用包含这些 *** 作的函数都是副作用,它们都会改变执行环境的状态。计算表达式也会引起副作用。执行序列中某些特定的点被称为序列点。在序列点上,该点之前所有运算的副作用都应该结束,并且后继运算的副作用还没发生。
再解释下什么是序列点和副作用:
C 语言中,术语副作用(side effect)是指对数据对象或者文件的修改。例如,以下语句
var = 99;
的副作用是把 var 的值修改成 99。对表达式求值也可能产生副作用,例如:
se = 100
对这个表达式求值所产生的副作用就是 se 的值被修改成 100。
序列点(sequence point)是指程序运行中的一个特殊的时间点,在该点之前的所有副作用已经结束,并且后续的副作用还没发生。
C 语句结束标志——分号(;)是序列点。也就是说,C 语句中由赋值、自增或者自减等引起的副作用在分号之前必须结束。我们以后会说到一些包含序列点的运算符。任何完整表达式(full expression)运算结束的那个时间点也是序列点。所谓完整表达式,就是说这个表达式不是子表达式。而所谓的子表达式,则是指表达式中的表达式。例如:
f = ++e % 3
这整个表达式就是一个完整表达式。这个表达式中的 ++e、3 和 ++e % 3 都是它的子表达式。
有了序列点的概念,我们下面来分析一下一个很常见的错误:
int x = 1, y;
y = x++ + x++;
这里 y = x++ + x++ 是完整表达式,而 x++ 是它的子表达式。这个完整表达式运算结束的那一点是一个序列点,int x = 1, y; 中的 ; 也是一个序列点。也就是说,x++ + x++ 位于两个序列点之间。标准规定,在两个序列点之间,一个对象所保存的值最多只能被修改一次。但是我们清楚可以看到,上面这个例子中,x 的值在两个序列点之间被修改了两次。这显然是错误的!这段代码在不同的编译器上编译可能会导致 y 的值有所不同。比较常见的结果是 y 的值最后被修改为 2 或者 3。不同的编译器会有不同的结果在此,我不打算就这个问题作更深入的分析,只要记住这是错误的,别这么用就可以了。
0次
原因:while()循环条件表达式k=0是个赋值表达式,将k的值赋为0,while在判断循环条件时,因为表达式的值为0,即是逻辑假,因此不执行循环体。
并且此时k的值是0
以上就是关于C语言与程序设计全部的内容,包括:C语言与程序设计、int k=10; while (k=1) k=k-1 ;则循环体执行10次,对吗网上是k=0,我这个是等于1,大家帮帮忙~、设有程序段: int k=10。 while(k=O)k=k-1; 则下面描述中正确的是(等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)