C语言错题集(小题)

错题小题集锦
1.能正确表示逻辑关系:”a≥10或a≤0”的C语言表达式是( )。

A: a>=10 or a<=0

B: a>=0|a<=10

C: a>=10&&a<=0

D: a>=10||a<=0

标准答案:D
解析:||表示的是或的意思,&&表示是与的意思,A选项中的or在c语言中不能识别。B选项中|不能识别,故选正确答案D。

  1. 若int i=10;执行下列程序后,变量i的正确结果是( )

    switch(i){

    case 9:i+=1;

    case 10:i+=1;

    case 11:i+=1;

    default:i+=1;

    }

A: 10

B: 11

C: 12

D: 13
标准答案:D

解析: i=10; 进入开关语句,符合 case 10: i++; i 变 11.
由于没有 break; 语句, 所以 并不跳出去,而 继续下走,遇到 case 11,
符合 case 11:i++; 进入 case 11, i 变 12.
由于没有 break; 语句, 所以 并不跳出去,而 继续下走,遇到 default:
符合 default:,进入 default:i++; i 变 13。
.到达 开关语句终了。 所以 答案是 D 13.

3.请阅读以下程序:

main()

{

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

   if(a=b+c) printf(“***\n”);

   else      printf(“$$$\n”);

}

以上程序(    )。

A: 有语法错不能通过编译

B: 可以通过编译但不能通过连接

C: 输出***

D: 输出$$$

标准答案:D
解析:先看下面这个程序:#include<stdio.h> #include<conio.h> int main(){ int a=5,b=2,c=1; printf("%d,%d\n",a=b+c,a); return 0; }运行结果看下图:
在这里插入图片描述

由此可知,+的优先级高于=,且赋值运算的返回值就是赋的值。所以你的程序if(a=b+c)中, 首先是b+c=0,然后将0赋值给a,同时这个0也作为if的判断条件,所以最后打印的是条件不满足的“$$$”:

在这里插入图片描述
4.件表达式 (exp)?a++:b–,则以下表达式中能完全等价于表达式(exp)的是( )。

A: (exp==0)

B: (exp!=0)

C: (exp==1)

D: (exp!=1)

标准答案:B
解析:exp 是一个变量。
这个条件表达式的意思是,如果(exp)为真,则执行 a++,否则执行b–。
而只要变量exp的值不为0(也就是false),(exp)都为真(true)。比如exp2或者exp-1,(exp)都为真。
所以(exp)等价于(exp!=0),也就是使用 (exp!=0)?a++:b-- 程序也能达到同样的效果。所以选B

5.已知x=43, ch=‘A’, y=0;则表达式(x>=y&&ch<‘B’&&!y)的值是( )。

A: 0

B: 语法错

C: 1

D: “假”
标准答案:C
解析:(1)当遇到表达式时应先看表达式有几个运算符,都是什么。该表达式包含5个运算符,两个逻辑与运算符&&,一个大于等于>=,一个小于<,还有一个逻辑非运算符!

(2),根据个运算符的优先级顺序进行运算。逻辑非!优先级最高为(在所有第二优先级),所以先运算!y,而!y=1。然后是x>=y该表达式也为1,再接着是ch<‘B’,该表达式的值也为1.

(3)最后是逻辑与运算,按自左向右的顺序进行。整个表达式实际相当于1&&1&&1。所以选C。

如果是大写Y,则!Y=0,其他不变选择A。

6.执行下列语句后a和b的值分别为( )。

int a, b, c;

a=b=c=1;

++a|| ++b && ++c;

A: 错误 1

B: 2 2

C: 2 1

D: 1 1

标准答案:C
解析:||的优先级高,所以++a||++b作为&&的左表达式参加运算
a的值为1,++a的结果为非零,所以||成立,忽略了++b
所以a的值被修改,b的值没有被修改
故a=2,b=1

7.若有说明:char *language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};

 则表达式*language[1]>*language[3]比较的是______________。

A: 字符F和字符P

B: 字符串BASIC和字符串JAVA

C: 字符B和字符J

D: 字符串FORTRAN和字符串PASCAL

标准答案:C
解析:language字符指针数组language[1]数组第二元素指向B*language[1]表示取字符指针值BBJ做比较

8.下定义,则说法错误的是( )。

  int a=100,*p=&a ;

A: 声明变量p,其中*表示p是一个指针变量

B: 变量p经初始化,获得变量a的地址

C: 变量p只可以指向一个整形变量

D: 变量p的值为100

标准答案:D
解析:变量P的值是表示一个地址而不是说他的值就是100,所以D选项错误。

9.下面不能正确进行字符串赋值操作的是( )。

A: char s[6]={“ABCDE”};

B: char s[5]={‘A’,'B’,'C’,'D’,'E’};

C: char *s;s=”ABCDE”;

D: char *s; scanf(“%s”,s);
标准答案:B
解析:B.不正确。s本来就是指向字符串的指针了。scanf时候不用加&取地址

  1. 下定义:

    int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

    int (*prt)[3]=a,*p=a[0];

    则下列能够正确表达数组元素a[1][2]的表达式是( )。
    A: *((*prt+1))

B: ((p+5))

C: (*prt+1)+2

D: ((a+1)+2)
标准答案:D
解析:a[1][2]是第二行第三个所以a[1][2]=6
你的数组是这样的
1 2 3
4 5 6
7 8 9

11.如果x是整型变量,则合法的形式是( )。
A: &(x+5)

B: *x

C: &*x

D: *&x

标准答案:D
解析*:
A.&(x+5) //&表示取地址,后面应该是变量名,不能是表达式。
B.*x   //*后面应该是指针变量,而x不是。  
C.&*x  //后面应该是指针变量,而x不是。  
D.
&x //相当于x

12.下面能正确进行字符串赋值操作的是

A: char s[5]={“ABCDE”};

B: char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};

C: char *s;s=“ABCDE”;

D: char *s;char a; scanf("%s",&s);

标准答案:C
解析:选项A)和B)定义的数组空间太小,至少应该为6个字符的长度才可以。选项D)中的指针 s未赋初值,所以指向―个不确定的地址,因而不能用 scanf输入数据到这一指针所指向的地址中。

13.若有以下说明和语句:

 char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};

 char * * q;

 q=language +2;则语句printf ("%o\n",* q )____

A: 输出的是language[3]元素的地址

B: 输出的是字符串PASCAL

C: 输出的是language[2]元素的值,它是字符串PASCAL的首地址

D: 格式说明不正确,无法得到确定的输出
标准答案:C
解析:language[2]指的应该是“PASCAL”的首地址
也就是选:
B.一个地址

14.序段:char s[ ]=”china”; char *p ; p=s ;

则下面叙述正确的是(     )。

A: s和p完全相同

B: 数组s中的内容和指针变量p中的内容相等

C: s数组长度和p所指向的字符串长度相等

D: *p与s[0]相等
标准答案:D
解析:A:s是字符数组,p是指向字符串的指针
B:显然数组s中的内容和指针变量p中的内容不相等,应该换一种说法“数组s中的内容和指针变量p所指向的字符串的内容相等”
C:s数组的长度为6(包含结束符’\0’),p所指向的字符串长度为5
D:*p=‘c’,s[0]=‘c’

15.设char **s;,以下正确的表达式是( )。

A: s=“computer”;

B: *s=“computer”;

C: **s=“computer”;

D: *s=‘c’;
标准答案:B
解析: char**s是将其中的·地址赋给 *s故选择答案B。

16.下面程序的功能是把316表示为两个加数的和,使两个加数分别能被13和11整除,请选择填空( )。

#include <stdio.h>

main()

{ int i=0,j,k;

  do{i++;k=316-13*i;}while( _______ );

  j=k/11;

  printf("316=13*%d+11*%d",i,j);

}

A: k/11

B: k%11

C: k/11==0

D: k%11==0
标准答案:B
解析:因为13i肯定能被13整除;
若while(k%11),就是while(k%11!=0);
即k不能被11整除时循环,不断地换下一个i,直到k能被11整除为止。
这时316=k+13
i,就能满足要求了。

17.t x=1, y=1;表达式(!x||y–)的值是( )。

A: 0

B: 1

C: 2

D: -1

标准答案:B
解析:x=1≠0,!x为假,值为0
y=1≠0,y–为真,值为1
!x||y–为真,值为1。表达式的值是1
选B

18.下一个算法的程序框图,该程序框图的功能是( )
在这里插入图片描述
A: 求输出a,b,c三数的最大数

B: 求输出a,b,c三数的最小数

C: 按从小到大排列

D: 将a,b,c按从大到小排列

标准答案:B
解析:a>b?和a>c?中当否时,就输出c,所以比较的是三个数中最小的那个数。

19.下面程序段中,for循环的执行次数是( )。

char  *s=”\ta\018bc”;

for(  ;*s!=’\0’; s++)      printf(“*”);

A: 9

B: 5

C: 6

D: 7

标准答案:C
解析:6次,你的字符串中总共有6个字符:
‘\t’, ‘a’, ‘\01’(这个字符是用8进制表示的,注意不可能是’108’的,8进制最大的数字是7), ‘8’, ‘b’, ‘c’

你可以用下面这个程序具体执行看一下:

#include <stdio.h>

int
main(void)
{
char *s = “\ta\018bc”;
for(; *s!=’\0’; s++) {
putchar( s );
printf("
\n");
}

return 0;
}

20.当定义一个结构体变量时系统分配给它的内存是:______

A: 各成员所需内存量的总和

B: 成员中占内存量最大者所需的容量的倍数

C: 结构中第一个成员所需内存量

D: 结构中最后一个成员所需内存量

标准答案:B
解析:系统分配给它的内存应该是成员中占内存量最大者所需的容量乘上所有成员的个数。
比如说一个struct type定义了一个int,一个char,一个float。
int4个字长,char1个字长,float4个字长。
而type的字长是12。

21.若在TC2.0下已定义了如下的共用体类型变量x,则x所占用的内存字节数为( )。

union  data

{

       int  i;

       char  ch;

       double  f;

} x;

A: 7

B: 11

C: 8

D: 10

标准答案:C
解析: double在16位机和32位机上都是占8字节的。
union共用体所占字节等于其占字节最多的成员的字节大小。
明显int 2字节,char 1字节,double 8字节,所以该共用体的大小就是double所占字节的大小,即8字节。

22.设有如下定义:

struct  sk

{int a; float b;} data, *p;

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

A: (*p).data.a

B: (*p).a

C: p->data.a

D: p.data.a

标准答案:B
解析:data[0].a ,data[0]是结构体数组第一个成员,不是指针,所以不能用->

23.设变量a是整型,f是实型,i是双精度型,则表达式10+a+i*f值的数据类型为( )。

A: int

B: float

C: double

D: 不确定

标准答案:C
解析:C double
由于运算符的优先级比+,-的优先级高,而且算术运算是左结合性,所以先做if。在C语言中,不同类型的变量在进行算术运算时,float型的变量要无条件的转化为double型。这样f转化为double(双精度型)型并与也为double(双精度型)的i相乘,得到double(双精度型)的值。之后,算10+‘a"。由于’a’为字符型,C语言规则,字符型数据在参加算术运算是要无条件的转化为int(整形)。这样10+’a’就为整型。最后10+'a’的值与if相加。10+‘a’为整型,if为double(双精度型)。由于double(双精度型)比整形高,所以整型变量自动变为double型。两个double(双精度型)的数相加,和仍为double(双精度型)。类型char->int->unsigned->long->double<-float这样转换的原因是为了尽可能的使得到的结果精度高。

24.序的功能是将从键盘输入的一对数,由小到大排序输出,当输入一对相等数时结束循环,请选择填空( )。

#include <stdio.h>

main()

{int a,b,t;

 scanf(“%d%d”,&a,&b);

 while( ___________ )

      {if(a>b)

         {t=a;a=b;b=t;}

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

       scanf(“%d%d”,&a,&b);

      }

}

A: !a=b

B: a!=b

C: a==b

D: a=b

标准答案:B
解析:选B,a不等于b时,就执行语句,即a!=b,反之,相等时结束,其中符合选项的就是B。

25.C语言中,错误的常数是()

A: 1E+0.0

B: 5

C: 0xaf

D: 0L

标准答案:A
A 是错误的,其中的E相当于10次方,0.0为指数,但是指数是不能为小数的.
B 是对的,.5相当与0.5,C语言中默认小数点前没有数字,就是0.
C 0x的意思为af是16进制数,顺便说一下8进制数前需要加一个0表示.
D 0L的意思为0是Long int型的整数,L是一种类型

定义:char p[20]; 则,p, &p[0] 两者没有区别
标准答案:Y

定义指针时不可以赋初值。
标准答案:N

函数指针所指向的是程序代码区。

标准答案:Y

fopen 函数打开一文本文件,在"使用方式"这一项中,为输入而打开需填入______,

标准答案:r&!@r+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值