二级C试题(4)


有以下定义: #include <stdio.h> char a[10],*b=a; 不能给数组a输入字符串的语句是( )。
A.gets(a)
B.gets(a10])
C.gets(&a[0});
D.gets(b);
正确答案:B
解 析:函数gets()的调用形式为gets(str_adr);str_adr存放字符串的起始地址。可以是字符数组名、字符指针或字符数组元素的地址。 gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。本题中定义一个长度为10的字符数组,和一个指针变量b,并且通过赋值让 它指向数组a。选项A、选项B、选项C和选项D中只有选项B中gets函数的参数a[0]不能表示数组a的首地址,故选项B不正确。所以,4个选项中选项 B符合题意。


C语言允许函数值类型缺省定义,此时该函数值隐含的类型是
int


以下不是无限循环语句的是
a for(y=0,x=1;x>=++y;x++)
b for(;;x++)
c while(1){x++}
d for(i=10;;i--) sum+=i
B和D都是无结束条件的for循环 因此无限循环

C中while(1)条件始终为真 也是无限循环

对于A for在执行时进行条件判断 此时 x为1  等于++y循环结束

main (){int a=0,b=o;a=10;b=20;printf("a+b=%d\n",a+b);}为啥输出“a+b=10"
这个程序不可能输出“a+b=10",如果是int a=0,b=0;a=10;b=20; 那么输出就应该就a+b=30,要是你把b=20给注释了,那么就会出现a+b=10

设m是一个三位数,从左到右用a、b、c表示各位的数字。则从左到右各位数字为b、a、c的三位数(用m表示)是
从左到右各位数字为b、a、c的三位数(用m表示)是
m=100b+10a+c

设x和y均为int型变量,则以下语句:x+=y; y=x-y; x-=y; 的功能是_______。 A) 把x和y按从小到大排序
把x和y的值换过来
x+=y把x+y的和放到x里
y=x-y把原来x的值放到y里
x-=y(x=x-y)把原来y的值放到x里


设x和y均为int 型变量,则以下语句:x+=y;y=x-y;y=x-y;x-=y;的功能是
A、把x 和y按从大到小排列
B、把x和y按从小到大排列
C、无确定结果
D、交换x和y中的值
x+=y执行后 (x)=x+y  (y)=y
y=x-y操作后 (x)=x+y  (y)=x
y=x-y操作后 (x)=x+y (y)=y
x-=y操作后 (x)=x (y)=y


#include "stdio.h" main() {int a,k=4,m=4,*p1=&k,*p2=&m; a=p1==&m; printf("%d\n",a); } 为什么a=0,求
a=p1==&m;等价于a=(p1==&m);//先判断p1与&m是否相等,将判断结果赋给a。因为p1指向k,即p1的值为k的地址,因与m的地址不相同,因此p1==&m的结果为假,在C中,假用0表示。



(C语言)设w、x、y、z、m均为int型变量,有一下程序段: w=1;x=2;y=3;z=4; m=(w<x) ? w:x;m=(m<y) ? m:y;m=(m<z) ? m:z;
则该程序运行后,m的值是?(为什么?)


x=(a<b)?m:n是意思是判断a<b是真的话x=m就是钱一个数,假(就是a>b)那么x=n(后一个数)。
m=(w<x)?w:x------->m=w=1;

m=(m<y) ? m:y---->m=m=1;

m=(m<z) ? m:z---->m=m=1;

所以m=1



int *p=a和int *p=&a有什么区别?
int a[10];
int *p=a;                //与前面定义的数组名a类型相同,才可以这样赋值。
int a;
int *p=&a;            //前面定义的a是普通变量,才可以这样赋值。


main() { int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r; printf("%d,%d,%d,%d\n",m,n,*p,*q); 求结果
结果:1,2,2,1
分析:前两个数字1,2,是定义的m和n对应的输出。后边两个两个数字2,1,实际上是通过指针对数字进行了对换。


当c的值不为0时,在下列选项中能正确将c的值赋给变量a、b的是(   )
A、c=b=a;  B、(a=c)||(b=c); C、(a=c)&&(b=c); D、a=c=b;
选C
A和D都是错误的表达式,
B只能把C的值赋给变量a,因为c不为零 所以(a=c)的值也不零,那么不管“||”后面的值是否为零,(a=c)||(b=c)的值始终为1,所以计算机不会再浪费时间去处理“||”后面的表达式,因为计算机已经得到(a=c)||(b=c)的值了。同理,如果(a=c)的值为零,计算机也不会再去处理“&&”后面的表达式。


1.能正确表示a和b同时为正或同时为负的逻辑表达式是? A: (a>=0&&b>=0)&&(a<0&&b<0) B: a*b>0 为什么选B


因为A为空集,(a>=0&&b>=0)与(a<0&&b<0)如果是或关系 即:(a>=0&&b>=0)||(a<0&&b<0)
那么A就对了
如果是与关系,则A为空集


设有如下说明typedef struct{ int n; char c; double x;}STD;则以下选项中,能正确定义结构体数组并赋初值的语句是A.STD tt[2]={{1,’A’,62},{2,’B’,75}}; B.STD tt[2]={1,"A",62,2,"B",75};C.struct tt[2]={{1,’A’},{2,’B’}}; D.struct tt[2]={{1,"A",62.5},{2,"B",75.0}};
正确答案:C
本题主要考查关键字typedef的作用和结构体的初始化。C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说,允许由用户为已存在的数据类型名定义一个“别名”。类型定义符typedef即可用来完成此功能。说明新类型名的语句一般形式为:
         typedef   类型名   标识符;
这里的“类型名”必须是在此语句之前已有定义的类型标识符,可以是任何基本类型、结构或联合类型符号。
在本题中,通过题目中程序的定义可以知道,STD为该结构体的类型,而不是结构体变量,因此,STD tt[2]的声明是正确的。
由于结构体的第三个成员变量为双精度型,而在选项A中,输入与其对应的值是整型,数据类型不匹配,因此不正确。
由于结构体的第二个成员变量为字符型,而在选项B和选项D中,用双引号引起,表示字符串,而不是单个字符,因此不正确。
在选项C中,虽然缺少一个元素,但系统提供了一个默认的值0。因此,这个赋值语句是正确的。


3.    设有以下说明语句
struct stu
{ int a;
float b;
} stutype;
则下面的叙述不正确的是
A)struct是结构体类型的关键字
B)struct stu是用户定义的结构体类型
C)stutype是用户定义的结构体类型名
D)a和b都是结构体成员名
struct stu
{ int a;
float b;
} stutype;
相当于
struct stu
{ int a;
float b;
};
stu stutype;

stutype是声明为stu类型的一个变量,结构类型名为stu



下面条件语句中,功能与其他语句不同的是()
A)if(a) printf("%d\n",x); else printf("%d\n",y);
B) if(a==0) printf("%d\n",y); else printf("%d\n",x);
C) if(a!=0) printf("%d\n",x); else printf("%d\n",y);
D) if(a==0) printf("%d\n",x); else printf("%d\n",y);

正确答案是选择D。why?
前三个都是 如果a=0就输出 y 否则输出  x

只有最后一个是 如果a=0 输出 x 否则输出 y


struct date{int year;int month;int day;}t[20];求sizeof(t)的值。详述步骤
sizeof(t)返回的是整个数组的大小,因为每个结构体有3个整数,每个整数是4个bytes,所以sizeof(t)返回的值是 20 x 4 x 3 = 240;同时有的体系int可能是2bytes,所以返回值也可能时120.

猜你喜欢

转载自yongjianchang.iteye.com/blog/2067800