所以解答是①。
15.若有以下定义:
chara;intb;floatc;doubled;则表达式a*b+d-c值的类型为
①float ②int ③char ④double
【解】基本类型的数据可以混合运算,但运算时,对要求运算分量类型相同的运算来说,如运算分量的类型不是全相同,则会有自动类型转换发生。
类型自动转换规则规定类型低(简单)的向类型高(复杂)的转换。
各类型由高到低的排列顺序是:
longdouble、double、float、unsignedlong、long、unsignedint、int。
这样,若有定义:
chara;intb;floatc;doubled;则表达式a*b+d-c的值的类型是double的。
首先计算a*b,得到int类型的值,接着计算a*b+d,得到double类型的值,最后计算a*b+d-c,得到double类型的值。
所以解答是④。
16.设a,b和c都是int型变量,且a=3,b=4,c=5,则下面的表达式中值为0的是
①’a’&&’b’ ②a<=b ③a||b+c&&b-c ④!
((a
c||1)
【解】对于表达式’a’&&’b’,两个非0运算分量的逻辑与结果为1。
对于表达式a<=b,由于关系式成立,结果也为1。
又由于变量a为非0,表达式a||b+c&&b-c的结果也为1。
对于表达式!
((a
c||1),先是计算(a
c得到结果为0;再计算它们的逻辑与,结果为0。
继续与1求逻辑或,得到结果为1。
最后,对1求逻辑非,得到结果为0。
所以解答是④。
17.设a=3,b=4,执行“printf(“%d,%d”,(a,b),(b,a));”的输出是
①3,4 ②4,3 ③3,3 ④4,4
【解】在调用格式输出函数的语句中,其中每个格式符对应一个输出项,格式符d要求输出项内容以十进制整数形式输出。
语句中的第一个格式符对应输出项(a,b)是一个逗号表达式,该表达式的值是b的值,所以先输出4。
接着输出字符逗号。
同样输出项(b,a)的值是a的值,输出3。
所以语句执行将输出4,3。
正解的选择是②。
18.使用“scanf(“x=%f,y=%f”,&x,&y)”,要使x,y均为1.25,正确的输入是
① 1.25,1.25 ②1.25 1.25 ③x=1.25,y=1.25 ④x=1.25 y=1.25
【解】格式输入函数的格式字符串中的字符可以分成三类:
空格类字符、其它普通字符和格式转换说明。
其中空格类字符用来自动跳过空格类字符,直至下一个非空格类字符。
普通字符要求输入字符与其完全相同。
格式转换说明对输入字符列按格式转换说明进行转换,得到内部值存储到对应输入项所指定的存储位置中。
格式输入函数调用scanf(“x=%f,y=%f”,&x,&y)以普通字符x=开头,输入时也要先输入x=。
接着是一个浮点数输入格式,所有能构成一个浮点数1.25的字符序列都能满足要求。
接着是普通字符列“,y=”,在输入的浮点数之后也要有字符列“,y=”。
最后又是浮点数输入格式,同样所有能构成一个浮点数1.25的字符序列都能满足要求。
问题给出的供选择答案中只有x=1.25,y=1.25是正确的输入。
所以选择③。
通常,格式输入函数调用中,不在格式字符串插入普通字符,要求输入与格式中的普通字符匹配的字符,而是简洁地写上输入格式即可。
19.设a,b为字符型变量,执行“scanf(“a=%c,b=%c”,&a,&b)”后使a为’A’,b为’B’,从键盘上的正确输入是
①‘A’’B’ ②‘A’,’B’ ③A=A,B=B ④a=A,b=B
【解】函数调用scanf(“a=%c,b=%c”,&a,&b)中,普通字符必须按格式字符串要求照原样输入,c格式对紧接的任何字符都输入。
所以实现问题的要求,输入字符列应为“a=A,b=B”。
另外要特别指出,在程序中,为表示字符常量,字符前后需加单引号。
但用字符格式输入字符时,在要输入字符前后不必另键入单引号。
若键入单引号,则这个单引号也将作为字符被输入。
正确的解答是④。
20.设有inti=010,j=10;则执行“printf(“%d,%d\n”,++i,j--);”的输出是
①11,10 ②9,10 ③010,9 ④10,9
【解】变量i和j的初值分别为八进制数010和十进制数10,格式输出函数调用printf(“%d,%d\n”,++i,j--)中,++i的值是变量i增1后的值,原来值是八进制数010,等于十进制数8,输出9。
j--的值是变量j减1之前的值,输出10。
格式字符串中的逗号是普通字符照原样输出。
所以问题给出的格式输出函数调用将输出9,10。
正确的解答是②
21.假定所有变量均已正确定义,下列程序段运行后x的值是
a=b=c=0;x=35;
if(!
a)x--;elseif(b);if(c)x=3;elsex=4;
①34 ②4 ③35 ④3
【解】以变量a,b,c的值均为0,变量x的值为35,语句:
if(!
a)x--;elseif(b);if(c)x=3;elsex=4;
由两个if语句组成。
首先执行前一个if语句“if(!
a)x--;elseif(b);”,因变量a的值为0,条件!
a成立,执行x--使x的值变为34。
接着执行后继的if语句“if(c)x=3;elsex=4;”,因变量c的值为0,条件不成立而执行x=4,最终使变量x的值为4。
正确解答是②。
注意前一个if语句的else部分的成分语句只有“if(b);”,这是一个单分支if语句,且其成分语句为空语句。
22.下面的程序段所表示的数学函数关系是
y=-1;
if(x!
=0)if(x>0)y=1;elsey=0;
-1 (x<0) 1 (x<0) 0 (x<0) -1 (x<0)
①y=0 (x=0) ②y=-1(x=0) ③y=-1(x=0) ④y=1(x=0)
1 (x>0) 0 (x>0) 1(x>0) 0(x>0)
【解】程序段首先置变量y的值为-1,接着按变量x值的不同情况重置变量y的值。
重置的首要条件是x!
=0,若变量x的值为0,则不再重置变量y的值,所以在x值为0情况下,y的值是-1。
在变量x的值不等于0的条下,若x的值大于0,重置变量y的值为1;若变量x的值小于0,重置变量y的值为0。
所以程序段实现当变量x的值为0时,变量y的值为-1;当变量x的值大于0时,置变量y的值为1;当变量x的值小于0时,置变量y的值为0。
正确解答为③。
23.设inta=8,b=7,c=6,x=1;执行语句
if(a>6)if(b>7)if(c>8)x=2;elsex=3;
后x的值是
①0 ②1 ③2 ④3
【解】将上述语句写成易读的结构化形式:
if(a>6)
if(b>7)
if(c>8)
x=2;
else x=3;
该语句的执行过程是,首先判定(a>6),因a的值是8,条件成立;接着判定(b>7),因b的值是7,条件不成立。
在上述语句中,没有对应if(b>7)的else,上述语句就因(b>7)的条件不成立而不执行任何有意义的动作,结束该语句的执行。
这样,变量a、b、c和x的值都不会因执行上述语句而改变,所以变量x的值依旧保持1。
所以解答是②。
24.执行下列程序段
x=9;
while(x>7)
{ printf(“*”);x--;}
后输出的结果是
①**** ②*** ③** ④*
【解】上述代码以x的初值为9,在x>7成立的情况下循环,每次循环输出一个*字符,并让x的值减1。
共执行2次循环,也就共输出了2个*字符。
所以解答为③。
25.循环语句“for(x=0,y=0;(y!
=123)||(x<4);x++);”的循环执行
①无限次 ②不确定次 ③4次 ④3次
【解】for循环语句的初始化部分置变量x和y的初值为0,循环条件是(y!
=123)||(x<4),每次循环后变量x的值增1。
由于循环过程中变量y的值未被修改过,循环条件又是一个逻辑或,其左分量(y!
=123)永远成立,也就是循环条件永远成立。
所以该循环语句将循环执行无限次。
正确解答是①。
26.设x和y为int型变量,则执行下面的循环后,y的值为
for(y=1,x=1;y<=50;y++){
if(x>=10)break;
if(x%2==1){x+=5;continue;}
x-=3;
}
①2 ②4 ③6 ④8
【解】for循环语句的初始化部分置变量x和y的初值为1,循环条件是(y<=50),每次循环后变量y的值增1,控制循环最多执行50次。
循环体有三个语句:
首先在发现变量x的值大于等于10时,结束循环;接着是当变量x除2的余数为1(即变量x是奇数)时,让变量x值增5,让x变成偶数,并直接进入下一轮循环;如变量x是偶数,则从变量x减去3,让变量x变成奇数。
由上述分析知,每两次循环使变量x的值增加2。
第一次循环后,变量x的值变成6。
第二次循环后,变量x的值变成3。
第三次循环后,变量x的值变成8。
第四次循环后,变量x的值变成5。
第五次循环后,变量x的值变成10。
第六次循环时,因变量x的值大于等于10,直接跳出循环,这次循环是非正常结束,对变量y的修正只执行了5次。
所以循环结束后,变量y的值增至6。
正确的解答是③。
27.在C语言中,下列说法中正确的是
① 编程时尽量不要使用“do语句while(条件)”的循环
②“do语句while(条件)”的循环中必须使用“break”语句退出循环
③“do语句while(条件)”的循环中,当条件非0时将结束循环
④“do语句while(条件)”的循环中,当条件为0时将结束循环
【解】do-while语句的一般形式是:
do语句
while(表达式);
其语义是重复执行其成分语句,直至表示条件的表达式值为0时结束。
do-while语句是正常使用的一种循环结构之一。
do-while语句的循环结束条件由while后的表达式值为0所控制,并不一定要有break语句跳出循环来结束循环。
do-while语句在条件值非0时,将继续循环,而不是结束循环。
条件值为0时,才结束循环。
所以正确的选择是④。
28.若有下列说明,则数值为4的表达式是
inta[12]={1,2,3,4,5,6,7,8,9,10,11,12};
char c=‘a’,d,g;
② a[g-c] ②a[4] ③a[‘d’-‘c’] ④a[‘d’-c]
【解】数组元素的下标自0开始顺序编号,值为4的元素是a[3]。
所以只有下标表达式的值为3才是正确的。
下标表达式g-c中的的变量g和c的值是还未被设定的,其值不确定。
a[4]的值为5,下标为4是不对的。
’d’-‘c’的值为1,a[1]的值是2,所以也是不对的。
变量c的值为’a’,’d’-c=3,所以正确解答是④。
29.设有定义:
“chars[12]={“string”};”,则printf(“%d\n”,strlen(s));的输出是
①6 ②7 ③11 ④12
【解】在C语言中,字符串是指在有效字符之后有字符串结束标记符的字符列,并约定字符串的长度是指字符串中有效字符个数,不包括字符串的结束标记符。
存于字符数组s中的字符串是”string”,该字符串的长度为6,所以输出该字符串的长度应是6。
正确的解答是①。
30.下列C代码中,合法的数组定义是
①inta[]={“string”}; ②inta[5]={0,1,2,3,4,5};
③chara={“string”}; ④chara[]={0,1,2,3,4,5};
【解】①错误的原因是整数数组不可以用字符串对其初始化。
②错误的原因是,数组初始化时,初始化指定的值的个数不能多于数组的元素个数。
③错误的原因是,能用字符串初始化的只有字符指针变量,或字符数组。
字符串不能对其它类型的变量初始化,包括字符变量。
④是正确的,因为字符数组可以用小整数(作为字符的ASCII代码值)对其元素初始化。
31.字符串”m\x43\\\np\102q”的长度是
①7 ② 9 ③15 ④16
【解】字符串的长度是指字符串中有效字符的个数。
在C程序中,组成字符串的字符可以是一般的普通字符,也可以是转义字符。
其中转义字符又可以用多种不同形式来表达:
反斜杠字符之后接上预先规定的字符,用来表示特殊字符或特定意义的控制字符。
如单引号字符、双引号字符、反斜杠字符等特殊字符,换行、回车、退格等控制字符。
反斜杠字符之后接上1至3位八进制数字符,这是直接用八进制数字表示字符的ASCII代码的方式。
反斜杠字符之后接上字符x,并后接1至2个十六进制数字符,这是直接用十六进制数字表示字符的ASCII代码的方式。
后二种能表示C语言允许的任何字符。
在本小题给出的字符串中,字符’\x43’是用十六进制数表示的一个字符,字符’\\’表示一个反斜杠字符,字符’\n’表示一个换行字符,字符’\102’是用八进制数表示的一个字符。
这样,所给字符串只有7个有效字符。
所以,该字符串的长度是7,解答为①。
32.设有如下定义,则正确的叙述为
charx[]={“abcdefg”},y[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’};
①数组x和数组y等价 ② 数组x和数组y长度相同
③数组x的长度大于数组y的长度 ④ 数组x的长度小于数组y的长度
【解】不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。
字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。
但尽管用字符初始化时,给出了字符串中的全部字符,但字符串自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多1个字节。
所以只有③才是正确的。
33.设有定义“inta=3,b,*p=&a;”,则下列语句中使b不为3的语句是
①b=*&a; ②b=*p; ③b=a;