c语言面试题及答案

时间:2021-08-31

  导读:C语言是一门通用计算机编程语言,应用广泛。在面试的时候刷一遍题库,能够帮助你加深各方面的知识点,使自己面试成功的几率更大。下面小编为大家带来c语言面试题及答案,希望能帮助到大家。

一、选择题(1)~(10)每小题2分,(11)~(50)每小题1分,共60分)

  在下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应的位置上,答在试卷上不得分。

  (1)在数据结构中,从逻辑上可以把数据结构分为_______。

  A)动态结构和静态结构      B)紧凑结构和非紧凑结构

  C)线性结构和非线性结构    D)内部结构和外部结构

  答案:C

  评析:逻辑结构反映数据元素之间的逻辑关系,线性结构表示数据元素之间一对一的关系,非线性结构表示数据元素之间一对多或多对一的关系。

  (2)若进栈序列为l,2,3,4,进栈过程中可以出栈,则下列选项中不可能的一个出栈序列是_______。

  A)1,4,3,2    B)2,3,4,l

  C)3,1,4,2    D)3,4, 2,1

  答案:C

  评析:栈是一种后进先出表,在选项c中,先出栈的是3,说明此时栈内必然有1,2,由于l先于2进栈,所以l不可能在2之前出栈,故选项C这种出栈序列是不可能的。

  (3)排序方法中,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_______。

  A)希尔排序    B)冒泡排序    C)插入排序    D)选择排序

  答案:A

  评析:希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。

  (4)在顺序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找关键码值11,所需的关键码比较次数为_______。

  A)2      B)3       C)4        D)5

  答案:C

  评析:二分法查找是用关键码与线性表的中间元素比较,然后根据比较结果来判断是结束查找,还是在左边或者右边子表按相同的方法继续查找。本题中,与ll比较的关键码分别为15,8,10,12四个。

  (5)对于n个结点的单向链表(无表头结点),需要指针单元的个数至少为_______。

  A)n-1    B)n    C)n+l      D)2n

  答案:C

  评析:在n个结点的单向链表(无表头结点)中,每个结点都有一个指针单元(即指针域),加上头指针,至少需要n+1个指针单元。

  (6)在软件开发过程中,软件结构设计是描述_______。

  A)数据存储结构     B)软件体系结构    C)软件结构测试    D)软件控制过程

  答案:B

  评析:从工程管理的角度来看,软件设计分为两步完成:概要设计和详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式。

  (7)模块本身的内聚是模块独立性的重要性度量因素之一。在7类内聚中,具有最强内聚    的一类是_______。

  A)顺序性内聚     B)过程性内聚      C)逻辑性内聚    D)功能性内聚

  答案:D

  评析:内聚性是一个模块内部各元素间彼此结合的紧密程度的度量。内聚共有7类,它们之间的内聚性由弱到强排列顺序为:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚和功能内聚。

  (8)数据存储和数据流都是_______,仅仅是所处的状态不同。

  A)分析结果    B)事件    C)动作    D)数据

  答案:D

  评析:数据流图有4种成分:源点或终点、处理、数据存储和数据流。数据存储是处于静止状态的数据,数据流是处于运动中的数据。

  (9)数据的完整性是指数据的正确性、有效性和_______。

  A)可维护性    B)独立性    C)安全性    D)相容性

  答案:D

  评析:数据模型的完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态及其状态的变化,以保证数据的正确性、有效性和相容性。

  (10)关系代数运算是以_______为基础的运算。

  A)关系运算    B)谓词运算    C)集合运算     D)代数运算

  答案:C

  评析:关系代数运算是以关系代数作为运算对象的一组高级运算的集合。它的基本操作是并、交、差、笛卡尔积,另外还包垂直分割(投影)、水平分割(选择)、关系的结合(连接)等。

  (11)能将高级语言程序转换成目标语言程序的是_______。

  A)调试程序    B)解释程序    C)编译程序      D)编辑程序

  答案:C

  评析:用高级语言编写的程序称为“源程序”,而计算机只能识别和执行由0和l组成的二进制指令,所以高级语言必须先用一种称为“编译程序”的软件,把源程序翻译成二进制形式的“目标程序”。

  (12) _______是构成c语言程序的基本单位。

  A)函数    B)过程    C)子程序       D)子例程

  答案:A

  评析:c程序是由函数构成的。一个c源程序至少包含一个main函数,也可以包含一个main函数和若干个其他函数,因此,函数是c程序的基本单位。

  (13)可以在C语言中用做用户标识符的是_______。

  A)void    B)as_b3    C)for        D)2c

  define    _123       -abc        Do

  WORD       If        cas         SIG

  答案:B

  评析:在c语言中规定,标识符只能由字母、数字和下划线三种符号所组成,而且第一个字符必须是字母或下划线。另外还需要注意的是关键字不能作标识符。选项A中void,C中for都为关键字,D中2c以字母开头。

  (14)若有以下类型说明语句:

  char w;int x;float y,z;

  则表达式w*x+z-y的结果为________类型。

  A)float    B)char     C)int   D)double

  答案:A

  评析:在进行运算时,不同类型的数据参加运算,需要先将其转换成同一类型的数据,然后再进行运算。转换的顺序由低到高为:char,short→int→unsigned→long→double→float,故结果为float型。

  (15)main(()

  {  float x=123A56;

  printf(“%-5.2f”,x);

  }

  以上程序输出的结果是________。

  A)123.4    B)123.5      C)123.45    D)123.46

  答案:D

  评析:f格式符,用来输出实数,以小数的形式输出。“%-m.nf”的含义是:输出数据共占m列,其中n位小数,如果输出位数小于m。则右端补空格。如果总长度大于列数,则按实际情况四舍五入输出。

  (16)下面语句的输出结果是________。

  Printf(“%d\n”,strlen(“\t\”\065\xff\n”));

  A)14          B)8

  C)5           D)输出项不合法,无正常输出

  答案:C

  评析:在c语言中,以“\”开头的字符均为转义字符,其中“\”后可跟l~3位八进制数或在“\”后跟字母x及l~2位十六进制数,以此来代表一个特定的字符。

  (17)下列程序的输出结果是________。

  main()

  {  int a=0,b=0,c=0;

  if(++a>0lI++b>0)++c;

  printf(“\na=%d,b=%d,c=%d”,a,b,C);

  }

  A)a=0,b=0,c=0       B)a=l,b=l,c=1

  C)a=l,b=O, c=I       D)a=0, b=1.c=1

  答案:C

  评析:

  “︱︱”是或运算,它有个“短路”的特点需要特别注意,当“︱︱”运算符左边的表达式的值为真时,则程序就不再对“︱︱”右边的表达式的值去进行运算,而是使得整个表达式的'值直接为真。

  (18)下列程序的输出结果是_________。

  Main()

  {  int i;

  for(i=1;i+l;i++)

  {  if(i>4){printlf(”%d”,i++);break;}

  }

  printf(“%d”,i++);

  }

  A)55                    B)56

  C)程序错误,没有输出    D)循环条件永远为真,死循环

  答案:B

  评析:本程序中有个for循环,但注意到for循环的条件是“i+l”,也就是只要i+l的值为真(非零值均为真),就执行循环。当i=l的时,i+l的值为真,判断if条件不成立,执行i++,输出i的值为5。

  (19)下列程序的输出结果是_________。

  #define A 100

  main()

  {  int i=O,sum=O;

  do{  if(I==(i/2)*2)continue;

  sum+=i;

  }while(++i<A);

  printf(“%d\n”,sum);

  }

  A)2500    B)2050    C)4    D)O

  答案:A

  评析:本题程序的功能是求1到_99之问(包括1和99)所有奇数之和。程序中的while循环的终止条件为++i=100,在while循环体内,如果i是偶数,则执行continue,跳过这一次循环,去执行下一次循环,否则求和。最后输出的值是1到99之间(包括l和99)所有奇数之和(1+99)*50/2=2500。

  (20)下列程序的输出结果是_________。

  main()

  {  int I=3;

  switch(i)

  { case 1:

  case 2:printf(”%d”,i);

  case 3:

  case 4:break;

  default:printf(”OK”);

  }

  }

  A)0    B)3    C)OK    D)没有任何输出

  答案:D

  评析:在本题中,i的值为3,由于“case 3:”后面没有break语句,所以继续向下执行“case 4:”后面的语句,由于“case 4:”后面的语句为break强行退出switch语句,所以,本题没有任何输出。

  (21)下列程序执行后的输出结果是________。

  main()

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

  int i,k=2:

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

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

  }

  A)456    B)258    C)369    D)789

  答案:C

  评析:根据二维数组的定义得出:m[O][O]=1,m[O][1]=4,m[O][2]=7,m[1][0]=2,rail][1]=5,m[1][2]=8,m[2][0]=3,m[2][l]=6,m[2][2]=9,所以本题的输出是第3行的值m[2][0],m[2][1],m[2][2],即369。

  (22)设已定义洱口k为int类型变量,则以下for循环语句_________。

  for(i=0;k=-1,k=1;i++,k++)

  printf(”****\n”);

  A)判断循环结束的条件不合法    B)是无限循环

  C)循环一次也不执行            D)循环只执行一次

  答案:B

  评析:本题定义了一个for循环,它的循环变量是i,但由于本题并没有去设置循环条件,所以循环的条件永远默认为真,即无限次执行循环。

  (23)下面程序的输出结果是___________。

  unsigned fun(unsigned num)

  {   unsigned k=1;

  do{

  k*=num%lO;

  num/=lO;

  }while(num);

  return(k);

  }

  main()

  {  unsigned n。26;

  printf(”%d\n”,fun(n));

  }

  A)0    B)4    C)12    D)无限次循环

  答案:C

  评析:本题定义了一个fun函数,用于num求和,具体执行过程如下:

  num=26:k=k*(num%10)=1*(26%10),所以k=6,num=num/10=2;

  num=2:k=k*(num%10)=6*(2%10),所以k=12,num=num/lO=O;

  num=O:while条件不成立,所以返回k的值12.

  (24)已知字母A的ASCII码值是65,字母a的ASCII码值是97,以下程序_______。

  main()

  {  char a=‘A’;

  int b=20;

  printf(“%d,%o”,(a=a+a,a+b,b),a+‘a’-‘A’,b);

  }

  A)表达式非法,输出零或不确定值

  B)因输出项过多,无输出或输出不确定值

  C)输出结果为20,141

  D)输出结果为20,141,20

  答案:C

  评析:本题中首先输出逗号表达式“a=a+a,a+b,b”的值,即是20。然后以八进制的形式输出a+‘a’-‘A’的值为97对应的八进制数141,由于最后一个表达式b没有对应输出格式的输出项表列就不会输出。

  (25)C语言函数返回值的类型是由__________决定的。

  A)return语句中的表达式类型    B)调用函数的主调函数类型

  C)调用函数时临时               D)定义函数时所指定的函数类型

  答案:D

  评析:函数值的类型应当是在定义函数时指定的。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致,如果不_致,则以函数类型为准,即函数类型决定返回值的类型。

  (26)下列程序执行后输出的结果是___________。

  int d=l:

  fun(int p)

  {  int d。5;

  d+=p++;

  printf(”%d,”,d);

  }

  main()

  {  int a=3;

  fun(a);

  d+=a++:

  printf(”%d\n”,d);

  }

  A)8,12    B)9,13    C)8,4    D)9,5

  答案:C

  评析:本题执行过程如下:首先调用fun函数,使得实参a的值3传递给形参p,得到局部变量d=8,打印出局部变量d的值8;返回主函数执行“d+=a++”,此处的d为全局变量,所以d=1+3=4(由于本题是值传递,所以在函数fun中对p值的改变并不能引起a的改变),故本题的输出是8,4。

  (27)已知下面的程序段,正确的判断是_________。

  #define A 3

  #define B(A)((_A+1)‘a)

  int a=3:

  ……

  X=3*(A+B(7));

  A)程序错误,不允许嵌套定义    B)X=93

  C)X=8l                        D)程序错误,宏定义不允许有参数

  答案:C

  评析:本题的宏定义是合法的,宏定义展开为3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。

  (28)定义int*swap()指的是_______。

  A)一个返回整型值的函数swap()

  B)一个返回指向整型值指针的函数swap()

  C)一个指向函数swap()的指针,函数返回一个整型值

  D)以上说法均错

  答案:B

  评析:一个函数可以带回一个整型值、字符值、实型值等,但是也可以带回指针型数据,即地址。本题的定义中,包括括号和·号,由于f)优先级高于t。故它是一个返回整型指针的函数。

  (29)以下程序段的输出结果是__________。

  main()

  {   char s1[10],s2[10],s3[10];

  scanf(”%s”,s1);gets(s2);gets(s3);

  puts(s 1);puts(s2);puts(s3);

  }

  输入数据如下:  (此处代表回车符)

  aaa

  bbb

  A)aaa    B)aaa    C)aaa\0bbb\0    D)aaabbb

  bbb

  bbb

  答案:B

  评析:scanf是标准的输入函数,在输入字符串aaa时,实际的内容为“aaa\0”,“\0”是由系统自动加入的;gets的功能是从终端读入一行字符,即一直读到换行符为止,并由系统自动以“\0”代替换行符。

  (30)下述函数功能是________。

  Int fun(char*x)

  {  char*y=x;

  while(*y++);

  return y-x-l;

  }

  A)求字符串的长度          B)求字符串存放的位置

  C)比较两个字符串的大小    D)将字符串x连接到字符串y后面

  答案:A

  评析:在函数体内定义一字符型指针并指向形参,然后遍历其中各字符直到碰到NULL,最后返回字符串首尾地址的差值,即字符串的长度。

  (31)以下程序的输出结果是_________。

  main()

  { char str[12]={‘s’,‘t’,‘r’,‘i’,‘n’,‘ g’};

  printf(”%d\n”,strlen(str));

  }

  A)6    B)7    C)ll    D)12

  答案:A

  评析:在c语言中,字符串的长度是其首字符到NULL(不含)字符的总字符个数。本题定义字符数组str的同时,对第7个元素,由系统自动添加上“\0”,故字符串的长度为6。

  (32)请读程序段:

  char str[]=”ABCD”,*p=str;

  printf(”%d\n”,*(p+4));

  程序段的输出结果是_________。

  A)68                 B)0

  C)字符‘D’的地址    D)不确定的值

  答案:B

  评析:在对字符数组赋字符串值时,系统会自动在字符串的末尾加上一个字符串结束标志“\0”,故指向字符数组的指针p的+(p+4)的值为“\0”。由于“\0”的编码值就是0,所以本题输出为0。

  (33)若有定义:int a[4][10];,则以下选项中对数组元素a[i][j]引用错误的是________。

  (0<=i<4,0<=j<10)

  A)*(&a[O][O]+10*i+j)     B)*(a+i)+j

  C)*(*(a+i)+j)             D)*(a[i]+j)

  答案:B

  评析:本题中选项B是错误的引用,*(a+i)+j只代表了a[i][i]的地址。

  (34)设有以下语句:

  char strl[]=”string”,str2[8],。str3,。str4=”strin∥;

  则__________不是对库函数的正确调用。

  A)strcpy(strl,”HELLOl”);    B)strcpy(str2,”HELL02”);

  C)strcpy(str3,”HELL03”);    D)strcpy(str4,”HELL04”);

  答案:C

  评析:c语言中:sgcpy(stl,st2);,其两个参数均为字符指针或字符数组,选项c中的目的串指针str3没有指向具体有效的存储单元,故是错误的调用。

  (35)请读程序:

  #include

  #include

  main()

  {  char*sl=”AbCdEf”,*s2=”aB”;

  s1++;s2++;

  printf(”%d\n”,strcmp(s 1,s2));

  }

  上面程序的输出结果是___________。

  A)正数    B)负数    C)零    D)不确定的值

  答案:A

  评析:函数strcmp的功能是比较字符串s1和s2,如果sl>s2,则返回个正数;如果sls2,所以函数的值为正数。

  (36)下面程序的输出是_________。

  char s[]=”ABcD”;

  main()

  {  char*p;

  for(p=s;p<s+4;p++)

  printf(”%s\n”,p);

  }

  A)ABCD    B)A        C)D    D)ABCD

  BCD       B          C      ABC

  CD        C          B      AB

  D         D          A      A

  答案:A

  评析:在第一次执行for循环的时候,字符数组的首地址赋给了指针变量p,使得指针变量p指向了s的首地址,输出p所指向的字符串;第二次执行for循环时,p值增加1,p指向了s的第二个元素输出BCD;第三次输出CD;第四次输出D;直到p指向字符串的结束字符“\0”,for循环终止执行。

  (37)以下程序输出的结果为__________。

  main()

  {  char* alpha[6]={“ABCD”,EFGH”,”IJKL”,”MNOP”,”QRST”,”UVwX”};

  char**p;

  int i:

  p=alpha;

  for(I=0;i<4;i++)

  printf(”%s”,p[I]);

  }

  A)ABCDEFGHIJKL            B)ABCD

  C)ABCDEFGHIJKLMNOP        D)AEIM

  答案:C

  评析:alpha[O]指向“ABCD”的首地址;alpha[1]指向“EFGH”的首地址;alpha[2]指向“IJKL”的首地址,依此类推。当执行到p=alpha后,p指向指针数组alpha的首地址。for循环中输出了4个字符串。

  (38)下面程序的输出结果是_________。

  #include

  main()

  {  char*p[]={”B00L”,”0PK”,”H”,”SP”};

  int i:

  for(i=3;i>=0;i–,i–)

  printf(“%c”,*p[i]);

  printf(”\n”);

  }

  A)SO    B)SP    C)SPOPK    D)SHOB

  答案:A

  评析:p[0]存放的是“BOOL\0”的首地址;p[1]存放的是“OPK\0”的首址等。

  在printf语句中输出的+p[I]表示p[i]字符串的第一个字符。在for循环中,i的初值为3,那么输出的第一个字符为“s”,接着两次i–,则输出的值为+p[1],即字符“0”,所以本题的输出为SO。

  (39)以下程序的输出结果是_________。

  #include

  void prt(int*x,int*y,int*z)

  {   printf(”%d,%d,%d\n”,++*x,++*y*(z++));}

  int a=10,b=40,c=20;

  main()

  {  prt(&a,&b&C);

  prt(&a,&b,&C);

  }

  A)ll,42,3l    B)ll,41,20    C)1l,21,40    D)11,41,2l

  12,22,41      12,42,20      11,2l,41      12,42,22

  答案:B

  评析:由于实参传送的是变量的地址,所以对形参指针所指向的单元内容的改变,即对实参内容的改变。

  (40)若一个外部变量的定义形式为static int x;,那么,其中static的作用应该是_______。

  A)将变量存储在静态存储区

  B)使变量x可以由系统自动初始化

  C)使x只能在本文件内引用

  D)使x的值可以永久保留

  答案:C

  评析:事实上,无论有无static修饰,外部变量都具有A、B和c三种特性。作为一种修饰,static仅是限制此类型外部变量的引用范围:只能在定义它的文件范围内使用。

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

  #include

  #define SQR(x)x*x

  main()

  {  int a,k=3;

  a=++SQR(k+1);

  printf(”%d\n”,a);

  }

  A)8    B)9    C)17    D)20

  答案:B

  评析:本题宏替换中遇到形参x以实参k+l代替,其它字符不变。sQR(k+1)展开后应为字符串k+l*k+l。

  (42)下面是对宏定义的描述,不正确的是_______。

  A)宏不存在类型问题,宏名无类型,它的参数也无类型

  B)宏替换不占用运行时间

  C)宏替换时先求出实参表达式的值,然后代入形参运算求值

  D)宏替换只不过是字符替代而已

  答案:C

  评析:宏替换实质上就是字符替代,它不可能去进行计算,故c是错误的。带参数的宏与函数相比,宏在程序编译之前已经将代码替换到程序内,执行时不会产生类似于函数调用的问题,可以说不占用运行时间。

  (43)以下程序(程序左边的数字为附加的行号)________。

  1#include

  2#include

  3main()

  4{char s[]=”string”;

  5  puts(s);

  6  strcpy(s,”hello”);

  7  printf(”%3s\n”,s);}

  A)没有错      B)第l行有错      C)第6行有错    D)第7行有错

  答案:B

  评析:字符串复制函数strcpy包含在头文件string.h中,因此,程序中的第l行文件包含命令是错误的。

  (44)若有如下说明,则__________的叙述是正确的。

  struct st

  {  int a;

  int b[2l;

  }a;

  A)结构体变量a与结构体成员a同名,定义是非法的

  B)程序只在执行到该定义时才为结构体st分配存储单元

  C)程序运行时为结构体st分配6个字节存储单元

  D)类型名struct st可以通过extern关键字提前引用(即引用在前,说明在后)

  答案:D

  评析:结构体变量a与结构体成员a同名是合法的定义,引用成员a的方法是a.a,变量a处于不同的“层次”上,系统完全能够分清。st是一个结构体名,不会为结构体名分配存储空间,应该是在运行时为结构体变量a分配6个字节的存储单元,故选项B和选项C错误。

  (45)若有以下结构体定义,则________是正确的引用或定义。

  struct example

  {  int x;

  int y;

  }v1;

  A)example.x=10          B)example v2.x=10

  C)struct v2;v2.x=lO    D)struct example v2={10};

  答案:D

  评析:在定义结构体变量时,不能只用结构体名example或关键字strum进行定义,必需要用结构体类型名struct example定义,在引用结构体成员变量时,需要用结构体变量名进行引用,所以选D。

  (46)下列程序的执行结果是_________。

  #include

  union un

  {  int i;

  char c[21;

  };

  void main()

  { union un x;

  x.c[0]=10:

  x.c[1]=1:

  printf(“\n%d”,x.i);

  }

  A)266    B)ll    C)265    D)138

  答案:A

  评析:由于本题定义的是共用体,所以成员表列中的整型变量x和字符数组c共占用同一个存储单元,且此存储单元为2个字节,通常c[O]位于低字节,c[1]位于高字节,所以x.i的值为266。

  (47)已知形成链表的存储结构如下图所示,则下述类型描述中的空白处应填_______。

  struct link

  Datanext{   char data;

  ___________

  }node;

  A)struct link next    B)link*next

  C)struct next link    D)struct link*next

  答案:D

  评析:在单向链表中,由于每个结点需要存储下一个结点的地址,且下一个结点的数据类型与前一个结点的数据类型完全相同,故应为struct link*next。

  (48)已知小写字母a的ASCII码为97,大写字母A的ASCII.码为65,以下程序的结果是__________。

  main()

  {  unsigned int a=32,b=66;

  printf(“%c\n”,atb);

  }

  A)66    B)98    C)b    D)B

  答案:C

  评析:位运算符“l”的作用是按位或,即两个二进制数的相应位中只要有一个为1,该位的结果值为l。最后以字符型输出,  98对应的字符“b”。

  (49)C语言库函数龟ets(str,n,fp)的功能是_________。

  A)从fp指向的文件中读取长度n的字符串存入str指向的内存

  B)从fp指向的文件中读取长度不超过n-l的字符串存入str指向的内存

  C)从fp指向的文件中读取n个字符串存/Xstr指向的内存

  D)从str读取至多n个字符到文件fp

  答案:B

  评析:fgets函数的作用是从指定的文件读入一个字符串。fgets(str,n,fp);中的n为要求得到的字符的个数,但只从fb指向的文件输入n-1个字符,然后在最后加一个‘\O’字符,因此得到的字符串共有n个字符。

  (50)下述的程序向文件输出的结果是__________。

  #include

  void main()

  {  FILE*fp=fopen(“TEST”,”wb”);

  fprintf(fp,”%d%5.0f%c%d”,58,76273.0,’-',2278);

  fclose(fp);

  }

  A)58 76273-2278      B)5876273。.000000-2278

  C)5876273-2278       D)因文件为二进制文件而不可读

  答案:C

  评析:fprintf函数工作时,多个数据间不会自动加分隔符,选项A错误;浮点数的输出格式是“%5.0f”表明其小数部分输出O位,即没有输出,所以选项B也是错误的。