C语言易错题

C语言易错题集合

1. 选择题

1,执行下列语句后a和b的值分别为( C )。

int a, b, c;
a=b=c=1;
++a|| ++b && ++c;

A: 错误 1
B: 2 2
C: 2 1
D: 1 1

2,若希望当A的值为奇数时,表达式的值为”真”,A的值为偶数时,表达式的值为”假”,则以下不能满足要求的表达式是( C )。

A: A%2==1 
B: !(A%2==0)
C: !(A%2)
D: A%2

3,已知 int x=10, y=20, z=30; 以下语句执行后x, y, z的值是( B )。

 if(x>y)
  z=x;x=y;y=z;

A: x=10,y=20,z=30 
B: x=20,y=30,z=30
C: x=20,y=30,z=10 
D: x=20,y=30,z=20

4,判断char型变量cl是否为小写字母的正确表达式是( D )。

A: 'a'<=cl<='z'
B: (cl>=a)&&(cl<=z)
C: ('a'>=cl)||('z''<=cl)
D: (cl>='a')&&(cl<='z')

5,下述程序的输出结果是( C)

main()
{
 int a=0,b=0,c=0;
 if(++a>0||++b>0)  ++c;
 printf("%d,%d,%d",a,b,c);
}

A: 0,0,0
B: 1,1,1
C: 1,0,1
D: 0,1,1,

6,语句:printf(“%d”,(a=2)&&(b= -2));的输出结果是(D)。

A: 无输出
B: 结果不确定
C: -1
D: 1

7, 若有定义:int a=3,b=2,c=1;并有表达式:①a%b,a>b>c,b&&c+1.则表达式值相等的是(C)

A: ①和②
B: ②和③
C: ①和③
D: ③和④

8,请阅读以下程序:

main()
{
   int a=5,b=0,c=0;
   if(a=b+c) printf(***\n”);
   else      printf(“$$$\n”);
}

以上程序(D)。

A: 有语法错不能通过编译
B: 可以通过编译但不能通过连接
C: 输出***
D: 输出$$$

9,
w=1,x=2,y=3,z=4,则条件表达式w的值是( D)

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

10,以下程序的输出结果是(B)。

main()
{int x=2,y=-1,z=2;
 if(x<y)
   if(y<0) z=0;
   else    z+=1;
 printf(%d\n”,z);
}

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

11,
对下述程序,正确的判断是( B)

main()
{
 int x,y;
 scanf("%d,%d",&x,&y);
 if(x>y)
  x=y;y=x;
 else
  x++;y++;
 printf("%d,%d",x,y);
}

A: 有语法错误,不能通过编译
B: 若输入3和4,则输出4和5
C: 若输入4和3,则输出3和4
D: 若输入4和3,则输出4和5

12,设int x,a,b;则下面if语句中错误的是(B )

A: if(a=b) x++;
B: if(a=
C: if(a-b) x++;
D: if(x) x++;

13,以下程序输出结果是(B)

main( )
{
 int x=1,y=0,a=0,b=0;
 switch(x)
 {
    case 1:switch(y)
     {
       case 0 :a++;break;
    case 1 :b++;break;
     }
    case 2:a++;b++;break;
    case 3:a++;b++;
 }
 printf("a=%d,b=%d",a,b);
}

A: a=1,b=0
B: a=2,b=1
C: a=1,b=1
D: a=2,b=2

14,
int a=0,b=5;执行表达式++a||++b,a+b后,a,b和表达式的值分别是(C)

A: 1,5,7
B: 1,6,7
C: 1,5,6
D: 0,5,7

15 能正确标识“当x的取值在[1,10]或[200,210]范围内当真,否则为假”的表达是(C)

A: (x>=1)&&(x<=10)&&(x>200)&&(x<=210)
B: (x>=1)||(x<=10)||(x>=200)||(x<210)
C: (x>=1)&&(x<=10)||(x>=200)&&(x<=210)
D: (x>=1)||(x<=10)&&(x>200)||(x<=210)

16有如下程序段

int a=14,b=15,x;
char c=‘A’;
x=(a&&b)&&(c<‘B’);

执行该程序段后,x的值为(D)。

A: true
B: false
C: 0
D: 1

17下面判断正确的是____________。(A)

A: char *a="china";等价于char *a; a="china";
B: char str[10]={“china”};等价于char str[10];str[]={“china”};
C: char *s=”china”;等价于char *s; *s=”china”;
D: char c[4]=”abc”,d[4]=”abc”;等价于char c[4]=d[4]=”abc”;

18,若有说明:char *language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};
则表达式*language[1]>*language[3]比较的是______________。(C)

A: 字符F和字符P
B: 字符串BASIC和字符串JAVA
C: 字符B和字符J
D: 字符串FORTRAN和字符串PASCAL

19,若有说明:int*p1,*p2,m=5,n;以下程序段正确的是( D)

A: p1=&m;p2=&p1
B: p1=&n;scanf("%d",*p1)
C: scanf("%d",n); *p1=n
D: p1=&n; *p1=m

20,若有以下定义和语句:

int a[]={l,2,3,4,5,6,7,8,9,10},*p=a;

则值为3的表达式是_________.(A)

A: p+=2,*(p++)
B: p+=2,*++p
C: p+=3,*p++
D: p+=2,++*p

21,若有以下定义,则赋值正确的是( C)。

int a ,b , *p;
float c, *q;

A: p=&c
B: q=p
C: p=NULL
D: q=new int

22,已有函数max(a,b),为了使函数指针变量p指向函数max,则下面选项中赋值方法正确的是(A)。

A: p=max
B: *p=max
C: p=max(a, b)
D: *p=max(a, b )

23,有以下程序

void  fun(char  *c,int  d)
{
   *c=*c+1;
   d=d+1;
   printf(%c,%c,”,*c,d)}

main()
{     char  b=’a’,a=’A’;
      fun(&b,a);
      printf(%c,%c\n”,b,a)}

程序的运行结果是( B )

A: a,B,B,a
B: b,B,b,A
C: a,B,a,B
D: b,B,B,A

24, p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是(B)

A: c=*p1+*p2
B: p2=c
C: p1=p2
D: c=*p1*(*p2)

25,以下正确的定义语句和赋值语句是_________。(B)

A: int b[3][5],(*p)[3],(*q)[5];p=b;q=b;
B: float b[3][5],*p[3];p[0]=b[0];p[2]=*b+4;
C: double b[3][5],s[5][3],*q;q=b;s=q;
D: int b[10],*q;char *s;q=b;s=b;

26,以下程序有错,错误原因是___________。(A)

 main()
 {int *p,i;
char *q,ch;
p=&i;   q=&ch;   *p=40;   p=q;}

A: p和q的类型不一致,不能执行p=q;语句
B: p中存放的是地址值,因此不能执行p=40;语句
C: q没有指向具体的存储单元,所以*q没有实际意义
D: q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行p=q; 语句

27,若有以下定义,则数值不为3的表达式是__________。( C )

int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;

A: x[3]
B: p1=x+3,*p1++
C: p1=x+2,*(p1++)
D: p1=x+2,*++p1

28设有以下定义:

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]的表达式是( D )。

A: *((*prt+1))
B: *(*(p+5))
C: (*prt+1)+2
D: *(*(a+1)+2)

29
有以下程序

#include 
main()
{
 int a[5]={2,4,6,8,10},*p,**k;
 p = a;  k = &p;
 printf("%d",*(p++));
 printf("%d\n",**k); 
}

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

A: 46
B: 22
C: 44
D: 24

30 p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( B)

A: c=*p1+*p2
B: p2=c
C: p1=p2
D: c=*p1*(*p2)

31,若有以下定义和语句,则对a数组元素地址的正确引用为________________。©

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

A: *(p+2)
B: p[2]
C: *(p[1]+1)
D: (p+1)+2

32,有以下程序

#include 
main()
{
 int a[5]={2,4,6,8,10},*p,**k;
 p = a;  k = &p;
 printf("%d",*(p++));
 printf("%d\n",**k); 
}

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

A: 46
B: 22
C: 44
D: 24

33,
已定义以下函数:

int fun(int *p){return *p;}

  fun函数返回值是 (  C )

A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值

34,
有以下程序

void ss(char *s,char t)
{ while*s)
{ if*s= =t)*s=t-'a'+'A';
s++;
}
}
main()
{ char str1[100="abcddfefdbd",c='d';
ss(str1,c); printf("%s\n",str1);
}

程序运行后的输出结果是(B)

A: ABCDDEFEDBD
B: abcDDfefDbD
C: abcAAfefAbA
D: Abcddfefdbd

35,若有以下定义,则数值不为3的表达式是__________。©

 int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;

A: x[3]
B: p1=x+3,p1++
C: p1=x+2,
(p1++)
D: p1=x+2,*++p1

36,有如下程序

main()
{ char s[]="ABCD", *p;
for(p=s+1; p<s+4; p++)printf("%s",p);}

该程序的输出结果是(D )

A: ABCDBCDCDD
B: ABCD
C: BCD
D: BCDCDD

37,对于两个类型相同的指针变量,不能进行( A )运算?

A: +
B: -
C: =
D: ==

38,
main函数的正确说明形式是___________。(B)

A: main(int argc,char *argv)
B: main(int abc,char **abv)
C: main(int argc,char argv)
D: main(int c,char v[])

39,下面说明不正确的是(D)

A: char a[10]="china";
B: char a[10],*p=a;p="china"
C: char *a;a="china";
D: char a[10],*p;p=a="china"

40, 若要对a进行+ +运算,则a应具有下面说明______(D)

A: int a[3][2];
B: char * a [ ]={“12”,”ab”};
C: char (*a)[3]
D: int b[10],*a=b;

41,若有以下程序段,

  int c1=1, c2=2, c3;
    c3=1.0/c2*c1;

则执行后,c3中的值是(A )。

A: 0
B: 0.5
C: 1
D: 2

42,设有以下语句:

struct st{int n; struct st *next;};
static struct st a[3]={5, &a[1], 7, &a[2], 9, ‘\0},*p;
p=&a[0];

则表达式( D)的值是6。

A: p++ ->n 
B: p->n++
C: (*p).n++
D: ++p->n

43, 下面四个选项中,均是合法整型常量的选项是( A)。

A: 160 -0xffff 011
B: -0xcdf 01a 0xe
C: -01986 012 0668
D: -0x48a 0x2e5 0x

44,
在下列叙述中,错误的一条是( B )。

A: 全局变量存放在静态存储区中,在程序开始执行时就给全局变量分配存储区,程序执行完才释放
B: 在有参函数中,形参在整个程序一开始执行时便分配内存单元
C: 用数组名作函数实参和形参时,应在主调用函数和被调用函数中分别定义数组
D: 在同一个源文件中,全局变量与局部变量同名时,在局部变量的作用范围内,全局变量不起作用

45,
以下程序的输出结果是(B)。

main()
{int x=2,y=-1,z=2;
 if(x<y)
   if(y<0) z=0;
   else    z+=1;
 printf(%d\n”,z);
}

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

46,设有以下定义和语句,则输出结果是(指针变量占2个字节)( B)。

struct  date
{long *cat;2字节)
 struct date *next;2字节)
 double dog;(8字节)
}too;
printf(%d”, sizeof(too));

A: 20
B: 16
C: 14
D: 12

47,若输入1.5、2.5,以下程序的输出结果为(C)。

main( )
{int max(float x, float y);
 float a, b;
 int c;
 scanf("%f, %f" , &a, &b);
 c=max(a, b);
 printf("%d", c);
}
max(float x, float y)
{float z;
 z=x>y ? x : y;
 return(z);
}

A: 1
B: 2.5
C: 2
D: 3

48,语句while(!E);中的表达式!E等价于( A)

A: E0
B: E!=1
C: E!=0
D: E
1

49,以下程序的输出结果是( )。

main()
{
 int x=2,y,z;
 x*=3+1;
 printf("%d,",x++);
 x+=y=z=5;
 printf("%d,",x);
 x=y=z;
 printf("%d\n",x);
}

A: 8,14,1
B: 8,14,5
C: 8,13,5
D: 9,14,5

50,以下程序的输出结果是( )。

main()
{int i=1,j=3;
 printf("%d,",i++);
  {int i=0;
   i+=j*2;
   printf("%d,%d,",i,j);
  }
 printf("%d,%d\n",i,j);
}

A: 1,6,3,1,3
B: 1,6,3,2,3
C: 1,6,3,6,3
D: 1,7,3,2,3

51,fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是(C )

A: 只写
B: 追加
C: 读或读写
D: 答案b和c都正确

52,
下面程序段的运行结果是( A)。

a=1;b=2;c=2;
while(a<b<c) {t=a;a=b;b=t;c--;}
printf("%d, %d, %d", a, b, c);

A: 1,2,0
B: 2,1,0
C: 1,2,1
D: 2,1,1

53,以下程序的输出结果是(C)。

#include
#include
main()
{
 int a=1,b=4,c=2;
 float x=10.5, y=4.0, z;
 z=(a+b)/c+sqrt((double)y)*1.2/c+x;
 printf("%f\n", z);
}

A: 14.000000 
B: 15.400000
C: 13.700000 
D: 14.900000

54,若要“向文本文件尾增加数据”,在fopen函数中应使用的文件方式是( B )。

A: “ab+”
B: “a”
C: “ab”
D: “a+”

55,能正确表示逻辑关系:”a≥10或a≤0”的C语言表达式是( D )。

A: a>=10 or a<=0 
B: a>=0|a<=10
C: a>=10&&a<=0 
D: a>=10||a<=0

56,对下述程序,正确的判断是( A )

main()
{
 int x,y;
 scanf("%d,%d",&x,&y);
 if(x>y)
  x=y;y=x;
 else
  x++;y++;
 printf("%d,%d",x,y);
}

A: 有语法错误,不能通过编译
B: 若输入3和4,则输出4和5
C: 若输入4和3,则输出3和4
D: 若输入4和3,则输出4和5

57,只能向终端输出一个字符的函数是( B )。

A: printf函数
B: putchar函数
C: getchar函数
D: scanf函数

58,有如下程序

main( )
{ float x=2.0,y;
  if(x<0.0) y=0.0;
  else if(x<10.0) y=1.0/x;
       else y=1.0;
  printf(%f\n”,y);
}

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

A: 0.000000
B: 0.250000
C: 0.500000 
D: 1.000000

59,以下程序的输出结果是(D )。

#include
void fun(float *p1,float *p2, float *s)
{s=(float *)calloc(1, sizeof(float));
 *s=*p1+*(p2++);
}
main()
{float a[2]={1.1, 2.2}, b[2]={10.0, 20.0}, *s=a;
 fun (a, b, s);
 printf(%f\n”, *s);
}

A: 11.100000 
B: 12.100000
C: 21.100000
D: 1.100000

60,
以下选项中,能定义s为合法的结构体变量的是( )。

A) typedef  struct  abc 
{
double a;
char b[10]}s;        

B) struct
{
double  a;
char b[10]}s;
C) struct  ABC
{
double  a;
char  b[10]}
ABC  s;

D) typedef struct ABC
{
double  a;
char  b[10]}

A: 在题目描述中
B: 在题目描述中
C: 在题目描述中
D: 在题目描述中

61,设有如下定义:

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

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

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

62,
设有以下说明语句:

struct lie
{
 int a;
 float b;
}st;

则下面叙述中错误的是(C )。

A: struct是结构类型的关键字
B: struct lie 是用户定义的结构类型
C: st是用户定义的结构类型名
D: a和b都是结构成员名
## 判断题
1,字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 对

2,“==”表示关系运算符等于, “=”表示赋值运算符。 对

3.,C语言的基本组成单位是语句 错

4,指针可以赋值,给指针赋值时一定要类型相同,级别一致。 对

5,C语言的基本组成单位是语句()。 错

6, C语言中,关键字及编译预处理命令用小写字母书写。 错

7,指针的类型是它所指向的变量或对象的类型。 对

8,两个指针在任何情况下相减都是有意义的。 对

9, 表达式*p++的运算顺序为先自增后取值。 错

10,指针、数组名、函数名都是地址。 对

11,一个指针变量的值是一个地址值。 对

12, 指针可以加上或减去一个int型数,也可以加上一个指针。 错

13, 通过变量名或地址访问一个变量的方法称为“直接访问”方式。 对

14,指向同一数组的两个指针p1,p2相减的结果与所指元素的下标相减的结果是相同的。 对

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

16, 如果两个指针的类型相同,且均指向同一数组的元素,那么它们之间就可以进行加法运算。 错

17,语句“int p;”中的p的含义为取值。 错

18,C语言中,只能用下标来引用数组元素。 错

19,如果两个指针的类型相同,且均指向同一数组的元素,那么它们之间就可以进行加法运算。 错

20, C语言中的文件是一种流式文件,读写时均以字符为单位。 对

21结构体和共用体成员的应用都可能引用最低一级的成员。 对

22,对于数值型数组来说,可以引用整个数组。 错

23,用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 对

24,将整数值赋值给枚举变量时不需要作强制类型转换。 错

25,枚举类型是一种基本的数据类型 错

26, 结构体变量作参数时是地址传递。 错

27,定义结构体typedef struct one { int a;}s; s a;则a为结构体变量 对

28,结构体和共用体成员的应用都可能引用最低一级的成员。 对

29,结构体数组不可以在定义时进行初始化。 错

30,表达式c=fgetc(fp)!=EOF的功能是从fp指向的文件中读取字符,并判断文件是否结束。 对

31, 函数原型说明中,省略形参变量或者将形参变量写成其它名称不影响程序的正确性。 对

32,C语言函数返回类型的默认定义类型是void 错

## 函数题
1,二维数组交换两行值功能函数的实现问题
现在有一个程序如下,要求完成对应的函数change(),该函数有三个参数,分别是二维数组arr和两个整数u、w,函数功能是要求实现将二维数组arr[][N]中行标为u和w的两行元素交换位置,交换规则是相同的列进行交换。已知该二维数组的行数和列数都为N,注意:行标和列标都从0开始。
#include
#define N 10
void change(int arr[][N], int u,int w)
{//请在此完成函数,u,w都是下标}
将两数组的指针传入change函数,在函数中将两指针对应的数组内容进行调换;

2,矩阵主对角线的平均值
题目描述:
输入一个n*n的矩阵,要求计算对角线的平均值,结果保留两位小数。
输入:
输入只有一个用例,第一行表示矩阵行数(也是列数),接下来n行,每行n个整数,表示矩阵的元素。
输出:
用一行输出主对角线元素的平均值,结果保留两位小数(四舍五入)。
根据二维数组的组数和每组个数尽行处理,使其对角数相加。

3,题目描述

密码:密码被盗,后果很严重。现在发现安全的密码至少应该满足下面两个条件:

(1).密码长度大于等于8,且不要超过16。

(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。

这四个字符类别分别为:

1.大写字母:A,B,C…Z

2.小写字母:a,b,c…z

3.数字:0,1,2…9;

4.特殊符号:~,!,@,#,$,%,^
使用for循环进行多次判断,使用if语句和sizeof()判断密码位数是否合格,在用fou循环判断每个字符是否合格,用4个初始数当他们有3个非0就合格;

你可能感兴趣的:(C语言易错题)