【C语言期末】题目+解析

文章目录

    • 题目
      • 1.下面哪个不是C语言的基本数据类型?( B )
      • 2.C语言的标识符应以字母或( A )开头。
      • 3.如果需要在C程序里调用标准函数库中的printf函数,则应该在程序的开头包含哪个头文件?( A )
      • 4.C语言源程序的扩展名是( B )。
      • 5.若变量已正确定义并赋值,表达式( A )不符合C语言语法。
      • 6.以下选项中不属于C语言的类型的是( D )。
      • 7.以下选项中合法的用户标识符是( B )。
      • 8.已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示的字符常量‘\101’是( A )。
      • 9.+=、*=运算符
      • 10.以下选项中,与k=n++完全等价的表达式是(A )。
      • 11.阅读下面的程序
      • 12.若有以下定义和语句:
      • 13.执行下列程序段后的输出结果是( A )。
      • 14.以下关于运算符优先顺序的描述中正确的是( C )。
      • 15.若int K=3;,且有下面的程序片段:
      • 16.设char CH;,其值为A,且有下面的表达式:
      • 17.有如下程序
      • 18.若有以下定义:
      • 19.以下程序的运行结果是( A )。
      • 20.若有以下说明:
      • 21.如有说明:`char s1[5],s2[7];` ,要给数组s1和s2整体赋值,下列语句中正确的是( B )。
      • 22.在定义int a\[5][4]; 之后,对a数组元素的引用正确的是( C )。
      • 23.在C语言中,设有数组定义:char array[ ]="China"; 则数组array所占的空间为( C )。
      • 24.定义如下变量和数组:
      • 25.以下程序的输出结果是( A )。
      • 26.下面程序段的运行结果是( A )。
      • 27.若有以下程序:
      • 28.定义为void类型的函数,其含义是( A )。
      • 29.对于C程序的函数,( A )的叙述是正确的。
      • 30.以下程序的运行结果是( C )。
      • 31.若已定义“int a[9],*p=a;”并在以后的语句中未改变p的值,则不能表示a[1]地址的表达式是( A )。
      • 32.有如下程序段:
      • 33.设有如下定义:
      • 37.假设有如下定义:
      • 38.设有以下语句:
      • 39.设有定义语句“char c1=49,c2=49;”,则以下表达式中值为0的是( B )。
      • 40.在位运算中,操作数每左移一位,其结果相当于( A )。
      • 41.以下程序的输出结果是( D )。
      • 42.下面程序把数组元素中的最大值放入a[0]中,则在if语句中的条件表达式应该是( B )。
      • 43.下列程序执行后的输出结果是( B )。
      • 44.以下程序的输出结果是( C )。
      • 45.以下程序的运行结果是( B )。
      • 46.在宏定义:#define PI 3.141592中,用宏名PI代替一个( )。
      • 47.设有以下说明语句,则下面的叙述不正确的是( C )。

视频传送门

题目

1.下面哪个不是C语言的基本数据类型?( B )

A.整型; B.逻辑型; C.浮点型; D.字符型;

解析:
	A:整型简单理解就是整数,int a=1,a就是一个值为1的整型变量
	B:逻辑型,在C语言里没有专门的逻辑型。布尔表达式的结果为0相当于是false,非0则真。
	C:float b=2.5; b就是一个值为2.5的浮点型变量,简单理解就是有小数。
	D.字符型,char ch='a'; 

2.C语言的标识符应以字母或( A )开头。

A.下划线;B.波浪线;C.字符*;D.字符#;

解析:标识符定义规则有三点
		1.不能数字开头
		2.不能是保留字。比如int、float这种
		3.可以是下划线和字母开头。
	做题的话还有一点
		不能加特殊符号,比如.号
扩展:
	1.自己实际写
		用的最多的还是驼峰起名法
		ABlogOfCMakesYouCanPassExam
		每个词的开头大写
	2.手撕源码
		遇到保留字,在前边加个my_
		比如my_LinkededList

3.如果需要在C程序里调用标准函数库中的printf函数,则应该在程序的开头包含哪个头文件?( A )

A.stdio.h; B.math.h; C.stdlib.h; D.不用包含任何头文件;

4.C语言源程序的扩展名是( B )。

A…cpp; B..c; C…obj; D…exe;

5.若变量已正确定义并赋值,表达式( A )不符合C语言语法。

A.3%2.0 B.a*b/c C.2/b D.a/b/c

解析:
	模运算:就是求余数。5除以3余2,所以5%3=2
	C语言里边,两个整型相除,不保留小数,5/3=1
	你真得觉得对浮点型进行模运算合理吗?
扩展:
	5/2.0=2.5;
	当一个整型和另一个浮点型运算的时候,会有整型提升,整型提升成浮点型。相当于5变成5.0了
	两个浮点型的相除。。。5/2.0反正能算出来是2.5

6.以下选项中不属于C语言的类型的是( D )。

A.signed short int B.unsigned long int C.unsigned int D.long short

解析:
	int表示的范围是有限的
	long:不够用了,可以用long,它的范围更大,再不够用,还有long long ,再不够用还可以用数组存,不用担心你的钱多到银行的系统存不了。
	short:感觉用int太浪费空间,可以考虑用short,节约空间
	unsigned:
		int不是4个字节吗?32个比特位,里边其实固定有一位是用来表示符号的。
		unsigned可以把符号位当成数来用。。。能表示的正数的范围会扩大,不能表示负数

7.以下选项中合法的用户标识符是( B )。

A.long B._2Test C.3Dmax D.A.dat

	解析:见2题

8.已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示的字符常量‘\101’是( A )。

A.字符A B.字符a C.字符e D.非法的常量

	解析:详解见视频。
		这题把8进制的101转成10进制就行

101 = 1 ∗ 8 2 + 0 ∗ 8 1 + 1 ∗ 8 0 = 64 + 1 = 65 101=1*8^2+0*8^1+1*8^0=64+1=65 101=182+081+180=64+1=65

9.+=、*=运算符

int main(){int k=2,i=2,m;

​     m=(k+=i*=k);printf("%d,%d\n",m,i);

	return 0;
}

执行后的输出结果是( C )。

A.8,6 B.8,3 C.6,4 D.7,4

原式 展开
i*=k i=i*k
k+=i k=k+i
	要点:
		1.不熟练就先展开
		2.留意视频里讲的等效替代,看代码的动态变化——进阶必备。
			i*=k算完之后,就相当于是k+=几?要看成这样

10.以下选项中,与k=n++完全等价的表达式是(A )。

A.k=n,n=n+1 B.n=n+1,k=n C.k=++n D.k+=n+1

11.阅读下面的程序

#include

void main(){
	
	 int i,j;
	
	 i=010;
	
	 j=9;
	
	 printf("%d,%d",i-j,i+j);

 }

则程序的运行结果是( D )。

A.1,19 B.-1,19 C.1,17 D.-1,17

	解析:
		0开头表示8进制的数
		0x开头16进制
		0b开头二进制
		
		这题,你先把010转成8进制,不会?。。。
		1、2、3、4、5、6、7、10
		8进制逢8进1,不8题乃种解法,一个一个数也能数出来

12.若有以下定义和语句:

  int a=010, b=0x10, c=10;

  printf("%d,%d,%d\n",a,b,c);

则输出结果是( B )。

A.10,10,10 B.8,16,10 C.8,10,10 D.8,8,10

13.执行下列程序段后的输出结果是( A )。

  int x=1,y=1,z=1;

   x+=y+=z;

  printf("%d\n",x<y?y:x);

A.3 B.2 C.1 D.4

	解析:
		?号左边是一个布尔表达式,真假决定去冒号左边的值还是右边
		还是第9题乃样,?:运算完之后,就相当于x

14.以下关于运算符优先顺序的描述中正确的是( C )。

A.关系运算符 < 算术运算符 < 赋值运算符 < 逻辑运算符

B.逻辑运算符 < 关系运算符 < 算术运算符 < 赋值运算符

C.赋值运算符 < 逻辑运算符 < 关系运算符 < 算术运算符

D.算术运算符 < 关系运算符 < 赋值运算符 < 逻辑运算符

	赋值运算符:形如=、+=
	逻辑运算符:&&(并且)、||(或者)
	关系运算符:大于号、小于号
	算术运算符:加减乘除

15.若int K=3;,且有下面的程序片段:

if(K<=0) printf("####");

else printf("&&&&");

上面程序片段的输出结果是( B )。

A.#### B.&&&& C.####&&&& D.有语法错误,无输出结果

解析:二选一,选哪个看真假

16.设char CH;,其值为A,且有下面的表达式:

CH=(CH>='A' && CH<='Z')?(CH+32):CH
法1:一点一点看,CH为A,肯定和A相等,所以&&左边为真,CH当然也小于Z了,所以右边也为真
法2:看语义,如果CH是一个大写字母,布尔表达式的结果就为真

则表达式的值是( B )。

A.A B.a C.Z D.z

17.有如下程序

int main() { 
	 int a=2,b=-1,c=2; 
	 if(a<b)
	 
	 if(b<0) c=0; 
	 else c++;
	 
	 printf("%d\n",c);
	 return 0;
}

该程序的输出结果是( C )。

A.0 B.1 C.2 D.3

	解析:
		1.if后边如果只有一句可以不写大括号。
		2.else和结构上(不是距离上)紧挨着的if配对,当if条件为假的时候,就会执行else里的语句
	只能说:
		动(手)的都懂

18.若有以下定义:

float x;

int a,b;

则正确的switch 语句是( C )。

A.switch(x){
  case 1.0:printf("*\n");  
  case 2.0:printf("**\n");}

B.switch(x){
  case 1,2:printf("*\n");
  case 3:printf("**\n");}

C.switch(a+b)  {
   case 1:printf("\n"); 
   case 1+2:printf("**\n");}

D.switch(a+b);{
   case 1:printf("*\n");
   case 2:printf("**\n");}
	解析:case的条件别写小数

19.以下程序的运行结果是( A )。

int main(){
   int n;

   for(n=1;n<=10;n++){

   if(n%3==0) continue;printf("%d",n);

   }
	return 0;
}

A.12457810 B.369 C.12 D.1234567890

	建议:看视频,有讲for循环的基础概念
	语义:打印1到10之间,不能整除3的数

20.若有以下说明:

char s1[ ]={"tree"},s2[]={"flower"}; 

则以下对数组元素或数组的输出语句中,正确的是( C )。

A.printf(“%s%s”,s1[5],s2[7]);

B.printf(“%c%c”,s1,s2);

C.puts(s1);puts(s2);

D.puts(s1,s2);

	简单理解:想打印字符串,用%s或者puts函数。
	补充:字符串经常用string表示

21.如有说明:char s1[5],s2[7]; ,要给数组s1和s2整体赋值,下列语句中正确的是( B )。

A.s1=getchar(); s2=getchar();

B.scanf("%s%s",s1,s2);

C.scanf(“%c%c”,s1,s2);

D.gets(s1,s2);

	简单理解:想调键盘,接受一个字符串,用%s(gets我当时就用的少,都用的scanf和printf这俩,后来也不用C语言了,有必要了再研究吧)

22.在定义int a[5][4]; 之后,对a数组元素的引用正确的是( C )。

A.a[2][4] B.a[1,3] C.a[4][3] D.a[5][0]

	解析:访问数组元素,下标别越界哥,基操

23.在C语言中,设有数组定义:char array[ ]=“China”; 则数组array所占的空间为( C )。

A.4个字节 B.5个字节 C.6个字节 D.7个字节

	解析:字符串结尾是斜杠0,你不写有人帮你写。China看上去是5个,还有隐藏的斜杠0,一共6个

24.定义如下变量和数组:

int i;

int x[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

则下面语句的输出结果是( C )。

for(i=0;i<4;i++) printf("%3d",x[i][3-i]);

A.1, 5 ,9 ,13 B.1, 6, 11, 16 C.4 ,7 ,10, 13 D.4,8 ,12 ,16

25.以下程序的输出结果是( A )。

#include

void main(){

  int i,x[3][3]={1,2,3,4,5,6,7,8,9};

  for(i=0;i<3;i++) 

  printf("%d,",x\[i][i]);

  printf("\n"); 
}

A.1,5,9, B.1,4,7, C.3,5,7, D.3,6,9,

	可以看视频。
	也可以参考前边的题。

26.下面程序段的运行结果是( A )。

char *s="abcde";

s+=2;

printf("%s",s);
	建议看视频,有讲指针的基础知识

A.cde B.字符’c’ C.字符’c’的地址 D.无确定的输出结果

27.若有以下程序:

int main(){
 int m[][3]={1,4,7,2,5,8,3,6,9};

 int i,j,k=2;

 for (i=0;i<3;i++){

 printf("%d",m[k][i]); }

return 0;
} 

程序运行后输出结果是( C )。

A.4 5 6 B.2 5 8 C.3 6 9 D.7 8 9

28.定义为void类型的函数,其含义是( A )。

A.调用函数后,被调用的函数没有返回值

B.调用函数后,被调用的函数不返回

C.调用函数后,被调用的函数的返回值为任意的类型

D.以上3种说法都是错误的

29.对于C程序的函数,( A )的叙述是正确的。

A.函数定义不能嵌套,但函数调用可以嵌套

B.函数定义可以嵌套,但函数调用不能嵌套

C.函数定义与调用均不能嵌套

D.函数定义与调用均可以嵌套

30.以下程序的运行结果是( C )。

void f(int a,int b){int t;
	 t=a;
     a=b;
     b=t;
}

int main(){int x=1,y=3,z=2;if(x>y) f(x,y);else 
		if(y>z)f(y,z);elsef(x,z);printf(%d,%d,%d\n”,x,y,z);return 0;
}

A.1,2,3 B.3,1,2 C.1,3,2 D.2,3,1

	解析:函数分值传递和地址传递。

31.若已定义“int a[9],*p=a;”并在以后的语句中未改变p的值,则不能表示a[1]地址的表达式是( A )。

A.a++ B.a+1 C.p+1 D.++p

	【记住这句话】数组名是数组首元素地址

32.有如下程序段:

int *p,a=10,b=1;

p=&a; a=*p+b;

执行该程序段后,a的值为( B )。

A.12 B.11 C.10 D.编译出错

33.设有如下定义:

struct Date

{ int year; 

  int month;

  int day;

 };

struct Teacher

{ char name[20];

  char sex;

  struct Date birthday;

}person;

对结构体变量person的出生年份进行赋值时,下面的赋值语句正确的是( C )。

A.year=1975; B.birthday.year=1975; C.person.birthday.year=1975; D.person.year=1975;

34.若有下面的定义:这个题有问题

struct Test{
  int s1;

 float s2;
 char s3;

 union uu{
  char u1[10];

  int u2[2];

 }ua;
}stu;

则sizeof(struct Test)的值是( A )。

A.19 B.17 C.14 D.27

35.以下各选项要说明一种新的类型名,其中正确的是( A )。

A.typedef int i1; B.typedef int=i2; C.typedef i1 int i3; D.typedef i4;

36.假设有如下定义:

struct {
 int a;

float b;

}data,*p;

若有p=&data,则对data中的a域的正确引用是( )。

A.(*p).data.a B.p->data.a C.(*p).a D.p.data.a

	*号,叫解引用,可以根据地址拿出来那里存的值

37.假设有如下定义:

struct City{

 char *name;

 long total;

}city[]={"Guangzhou",800,"Meizhou",600,"Shanghai",500,"Hangzhou",400};

能正确输出字符串Meizhou的语句是( D )。

A. printf(“%c”,city[1].name)

B. printf(“%s”,city[1].name[1]);

C. printf(“%s”,city.name[1]);

D. printf("%s",city[1].name);

	city是城市数组,city[1]才是一个城市对象

38.设有以下语句:

char x=3,y=6,z; 
z=x^y<<2;

则z的二进制值是( B )。

A.00011011 B.00010100 C.00011100 D.00011000

39.设有定义语句“char c1=49,c2=49;”,则以下表达式中值为0的是( B )。

A.c1&&c2 B.c1^c2 C.c1&c2 D.c1|c2

40.在位运算中,操作数每左移一位,其结果相当于( A )。

A.操作数乘以2 B.操作数除以2 C.操作数除以4 D.操作数乘以4

41.以下程序的输出结果是( D )。

#include

void main( ){
  char *p1, *p2, str[50]="ABCDEFG";
  p1="abcd"; p2="efgh";
  strcpy(str+1, p2+1); strcpy(str+3, p1+3);
  printf("%s", str);
}

A.AfghdEFG  B.Abfhd   C.Afghd    D.Afgd

解析:
	执行strcpy(str+1, p2+1);后,str所对应的字符串变为“Afgh”,
	再执行strcpy(str+3, p1+3);后,str所对应的字符串变为“Afgd”

42.下面程序把数组元素中的最大值放入a[0]中,则在if语句中的条件表达式应该是( B )。

void main( ){
  int a[10]={6, 7, 2, 9, 1, 10, 5, 8, 4, 3}, *p=a, i;
  for(i=0; i<10; i++, p++)
  if(________) \*a=\*p;
  printf("%d", *a);
}

A.p>a     B.*p>a[0]     C.*p>*a[0]     D.*p[0]> *a[0]

43.下列程序执行后的输出结果是( B )。

void main( ){
 int a\[3][3], *p, i;
 p=&a\[0][0];
 for(i=0; i<9; i++) p[i]=i+1;
 printf("%d\n", a\[1][2]);
}

A.3   B.6   C.9   D.随机数

44.以下程序的输出结果是( C )。

#include 
void fun(int *s){
  static int j=0;
  do
   s[j]+=s[j+1];
   while (++j<2);
}

void main( ){
  int k, a[10]={1, 2, 3, 4, 5};
  for(k=1; k<3; k++) fun (a);
  for(k=0; k<5; k++) printf ("%d", a[k]);
}

A.34756     B.23445     C.35745     D.12345

45.以下程序的运行结果是( B )。

#define MIN (x, y) (x) < (y) ? (x) : (y)
void main ( ){
  int i = 10, j = 15, k;
  k = 10 * MIN (i, j);
  printf("%d\n", k); 
}

A.10 B.15 C.100 D.150

解析:
	语句k = 10 * MIN (i, j);在预编译时将进行宏替换为:k = 10 * (i) < (j) ? (i) : (j);
	因i = 10,j = 15,所以语句等价于k = 10 * 10 < 15 ? 10 : 15;,10*10比15大,
	因此k的值将是15。故正确答案是B。

46.在宏定义:#define PI 3.141592中,用宏名PI代替一个( )。

这个题有问题
A.常量B.单精度数C.双精度数D.字符串

47.设有以下说明语句,则下面的叙述不正确的是( C )。

struct stu{
 int a;
 float b;
} stutype;

A.struct是结构体类型的关键字

B.struct stu是用户定义的结构体类型

C.stutype 是用户定义的结构体类型名

D.a和b都是结构体成员名

解析:stutype是类型为struct stu的结构体变量,不是结构体类型名。故选择答案是C。

你可能感兴趣的:(B站视频配套笔记,c语言,笔记)