C语言易错题目

(一)必考知识点

1.实型常量(浮点数)

(1)小数形式

小数形式的实型常量由两部分组成:数字和小数点。如:0.1212..12都是合法的实型常量。

(2)指数形式

在C语言中,以"e"或"E"后跟一个整数来表示以10为底的幂数。如:2.306可以表示为0.2306E12.306e023.06e-1。C语言语法规定:

字母e或E之前必须要有数字,且e或E后面的指数必须为整数

例:以下正确的实型常量()

A.5.    B.3.   1415     C.456e-2     D.0.04e+1.5  F.089  G.5e   H.E6

解析:AC.

浮点数可以表示为小数或者指数的形式,小数的话必须有数字和小数点,指数的e和E的后面必须是整数,必须有数字。小数点之后的尾数之前不能有空格。

2.用户标识符 

(1)标识符的第一个符号一定是字母或者下划线

(2)标识符只能由字母,下划线和数字组成

  (3)   标识符不能是c语言关键字

  例:下列不合法的标识符有哪些:

 A,wb-1        B.file           C,Main          D.PRINTF           E._123   F.printf        G.As       H.Dim

 解: AG:要分清-和_的区别 .As是关键字

3.C语言语法的表达式

常量、变量、函数调用以及按C语言语法规则用运算符运算数连接起来的式子都是合法的表达式 
最后一类可以理解为运算符和运算对象的组合。例如:

  • 算术表达式 = 算术运算符 + 运算对象
  • 赋值表达式 = 赋值运算符 + 运算对象
  • 复合赋值表达式 = 复合赋值运算符 + 运算对象
  • 自增、自减表达式 = 自增、自减运算符 + 运算对象
  • 逗号表达式 = 逗号运算符 + 运算对象
  • 关系表达式 = 关系运算符 + 运算对象
  • 逻辑表达式 = 逻辑运算符 + 运算对象
  • 条件表达式 = 条件运算符 + 运算对象

例:如果变量已经正常赋值且被定义,符合C语言的语法表达式为:

        A)a+=7;    B)a=7+b+c,a++   C)int(12,3%4)    D)a=a+7=c+b

解:B.表达式后面没有分号排除A。C中没有运算符号。 D中的c+b给了a+7,而a+7不是一个变量

 4.赋值语句

 赋值表达式再加上分号构成的表达式语句              变量=表达式;

(1)由于在赋值符“=”右边的表达式也可以又是一个赋值表达式。因此,下述形式
    变量=(变量=表达式);是成立的,从而形成嵌套的情形

(2)变量说明中不允许给一个变量连续赋值

以下非法的赋值语句为:

A)++(i+1);     B)x=j>0;     C)k=int(a+b);

解:AC,  ++运算符的后面必须是变量,而不能是常量和表达式. C应该写成k=(int)(a+b);

5、常量

c语言的常量分为字面常量,const修饰的常变量,#define定义的标识符常量,枚举常量。

(1)const:实际上是常量,但是还是一个变量

//const修饰的常变量:
#include<stdio.h>
int main()
{
  //const-常属性
  //const修饰的常变量

  int n=10;
  int a[n]={0};//编译错误

  const int num=10;
  num=8;//编译错误
  printf("%d",sum);
}  

(2)枚举常量

enum Color
{
  red;
  yellow;
  blue;//枚举常量,值分别为0,1,2
}

int main()
{
 enum Color color=blue;
 color=yellow;//error
}

(3)字符串常量:

字符串的结束标志是’\0‘ 。“\0"是字符串,'\0'是字符。

0和’\0'是一样的,ASCII码值都是0,用%d打出来的是0,用%c打出来的是’’0‘是字符0,ASCII码值是48.

int main()
{
 char arr1[]="abc";
 char arr2[]={'a','b','c'};
 printf("%d",arr1);//3
 printf("%d",arr2);//15 输出的是随机值
}

6.程序控制结构 

(1)goto语句:无条件转移语句,与if语句一起使用构成循环   goto 标号; 

 从多重循环跳到外面的某一层循环的时候任何层次使用goto语句

 if语句的控制条件可以使用任意表达式 

int main()
{
 int i=0,sum=0;
 loop:sum+=1;
 i++;
 if(i<=100) goto loop;
 printf("%d",sum);
}

(2) 习题集:

1).双%输出%d

int main()
{
 int a=1;
 printf("%%d",a);//输出%d
}

2)switch-case中无break;

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

 输出2和1

3.)关系运算的值判断

void main()
{
 int a=5,b=4,c=3,d=2;
 if(a>b>c)//括号为关系运算,a>b为1而1>c为0所以不执行
 printf("%d",d);
 else if((c-1>=d==1)//>=优先级高于==
  printf("%d",d+1):
else printf("%d",d+2);
}

输出3

4.)     !x  在while中  输出5 

int main()
{
 int x=5;
 do{
  printf("%d",x--);
}while(!x)//当x为0才成立
}

5)输出-1

int main()
{
 char x=0xFFFf;//1111 1111 1111 1111的char为8个字节,除去前面最高八位
 printf("%d",x--);
}

 6)输出2

void main()
{
 int a=2,b=-1,c=2;
 if(a<b)
 if(b<0) c=0;
 else c++;
 printf("%d",c);
}
 等价于
void main()
{
 int a=2,b=-1,c=2;
 if(a<b)
 {if(b<0) c=0;}
 else c++;
 printf("%d",c);
}//注意else和if哪个配对

7)暴力三题

int main()
{
 int a=10,y=0;
 for(;--a;)
 if(a%3==0)
  y+=a;
 y++;
}//输出10

int main()
{
 int a=2,n=5,s;
 s=a;
 for(;--n;)
   s=s*10+a;
 printf("%d",s);
}//输出22222

int main()
{
 int x,y,z=0;
 for(x=1,y=5;x<y;x++,y--)
 {
  z+=x*10+y;
 }
 printf("%d",z);
}//输出39

8)关于continue的使用

//输出100以内可以被3整除并且个位数为6的所有整数
#include<stdio.h>
int main()
{
 int i,j;
 for(i=0;i<10;i++)
  {
   j=10*i+6;
   if(j%3==0) continue;
   printf("%d",j);
  }
}

//输出为8
{
 int x=1,y=3;
 do{
  y+=x++;
  if(y%7==0) continue;
 }while(y<15);
printf("%d",x);
}

7)字符数组的相关应用

char s[12]={"string"};
printf("%d",strlen(s));//输出6

char c[]="Taiyuan"//元素个数为8

char c[5]={'a','b','\0','c','\0'};
printf("%s",c);//输出ab c

int y[][3]={1,2,3,4,5,6,7}={
   
   {1,2,3},{4,5},{6,7}};
数组第一维的长度为3

与put(str)等价的是
printf("%s\n",str);

有俩个字符数组a,b.从键盘中输入俩个字符串a和b存储在a和b中具体格式
scanf("%s%s",a,b);

8)在数组a中查找值为x的元素

int main()
{
 int a[10]={24,76,89,4};
 int x,i,t=0;
 scanf("%d",&x);
 for(i=0;i<10&&t==0;i++)
   if(a[i]==x)
    {
    printf("%d",a[i]);
    t=1;
    }
if(t=0) printf("没找到”);
}

 9)把字符串中所有的‘a'删除

void main()
{
 char a[81];
 int i,j;
 gets(a);
 for(i=j=0;a[i]!="\0";i++)
  if(a[i]!='a')
     j++;
 a[j]='\0';
 puts(a);
}
 

10)较难 不一定掌握

int main()
{
 char a[]="1234";
 short *p=NULL;
 p=(short*)a;

 printf("%d",*p);
 printf("%d",*++p);//先用++再*
}

在我们的编译器中,高位放在高地址。

1                ascii码值    49
2                                  50
3                                  51
4                                  52

由于每个字节之间的进制为256(0--255)

则*p为50*256+49=12849

*p++为52*256+51=13363.

 执行以下程序段后,变量a,b,c的值分别是(   C  )。
int x=10,y=9;
int a,b,c;
a=(--x= =y++)?--x:++y;
b=x++;
c=y;
A、a=9,b=9,c=9     B、a=8,b=8,c=10
C、a=9,b=10,c=9        D、a=1,b=11,c=10

11)

int main()
{int a=0,b=0,c=0;
 c=(a-=a-5),(a=b,b+3);
 printf("%d%d%d",a,b,c);
}

输出0,0, 5由于-的优先级高于-=

12)printf的奇异输出

int x=496;
printf("%-06d*\n",x);

*496   *

21
float a=3.1415;
printf("|%6.0f|\n",a);

|           3|

int a=99;

printf("%d",a<=100);//结果为1

关系运算符的结果为0或者1 

13)

int main()
{
  int a=2,b=-1,c=2;
  if(a<b)
    if(b<0) c=0;
  else c+=1;
printf("%d",c);
}
else与其最近的未配对的if配对
if (a<b) 
{if(b<0) c=0; 
else c+=1;}

  c的值不变还是2

int main()
{
int x=1,y=2,z=3;
if(x>y)
  {if(x>z) printf("%d",x);
  else printf("%d",y);}
printf("%d",z);
}//输出3

14)下面程序是把316分成俩个加数的和,使得俩个加数能够被13和11整除

#include<stdio.h>
int main()
{
 int i=0,j,k;
 do {
  i++;
  k=316-13*i;
  }while(k%11);
 j=k/11;
 printf("加数为%d%d,i,j);
}

15)

int main()
{
 int x,i;
  for(i=1;i<=100;i++)
  {x=i;
   if(++x%2==0)
    if(++x%3==0)
      if(++x%7==0)
       printf("%d",x);
  }
}

 (x)%7==0&&(x-1)%3==0&&(x-2)%2==0

16)

int i,j,m;
for(i=1;i<15;i+=4)
 for(j=3;j<=19;j++)
  m++;
printf("%d",m);
共走4*5=20次

17)

fun(int a,int b,int c)
{
 c=a*b;
}

void main()
{
 int c;
 fun(2,3,c);
 printf("%d",c);
}

c无定义 。因为函数的值传递的时候,外面的c和内部的c无关,因为在不同的内存空间,不会改变值。

18)

void main()
{
 int k=4,m=1,p;
 p=fun(k,m);
 printf("%d",p);
 p=fun(k,m);
 printf("%d",p);
}

fun(int a,int b)
{
 static int m,i=2;
 i+=m+1;
 m=i+a+b;
 return(m);
}

(二)小题填空

  1. Printf(“%%d%d”,123)----输出%d123
  2. 逻辑运算的结果是0和1
  3. 正确的标识符由(数字,字母,下划线)组成,且由(字母和下划线)组成
  4. 一个算法应具有(有穷性,确定性),(有零个或多个输入),(有一个或多个输出),(有效性)。
  5. 按变量地址访问变量直接访问,按存放变量的地址的变量去访问变量叫间接访问。
  6. 文件包含的一般形式(#include<>)
  7. 宏定义中宏的名字一般用大写字母,容易做到(一改全改)
  8. 结构体是一种(构造)数据类型用途是把(不同类型)的数据组合成一个整体
  9. 位运算的运算对象是(整型)和(字符型)数据,而不可以是其他类型的数据
  10. 文件)是存储在外部介质上数据的集合,是操作系统数据管理的单位
  11. 设有“int x=2,y”则逗号表达式”y=x+5,x+y”的值是(9)
  12. 变量的存储类型共有四种(整型),(实型),(字符型),(无字符型)
  13. 复合语句是用{}
  14. Putchar和getchar引用#include<stdio.h>
  15. C语言表达式和语句的区别在于(句尾有无分号结束)
  16. Goto语句为(无条件转向语句),当程序执行该语句的时候可以转移到指定位置
  17. C语言提供的预处理主要功能是(宏定义),(文件包含处理),(条件编译)
  18. 位运算是对一个数据的某些(二进制位)进行运算
  19. C语言根据数据的组织形式可以把文件分为(文本文件)和(二进制文件)
  20. 设char a[]=”chain”数组存储的空间(6个字节)
  21. C语言以追加的方式打开一个文件选择(“a”)参数
  22. Break(在多重循环中,只能退出最靠近的那一层循环语句)
  23. 俩个指针变量的值相等时,表明俩个指针变量(指向同一内存单元地址或者都为空)
  24. 字符型指针变量存入的是(字符串的首地址)
  25. 要求运算数必须是整型的运算为(%)
  26. While(!e)括号表示e==0
  27. 函数返回值的类型最终取决于(函数定义时形参的类型)
  28. 若在fopen函数中使用文件的方式是“wb+”,含义为(为读写打开一个二进制文件0
  29.  在定义指针的时候,标识符前面的*表示后面的指针变量所指向的内容
  30. 设a和b都是double类型的变量,且a=5.5,b=2.5,则表达式(int)a+b/b=6.000000 把a转化为int的时候直接把小数点后面的数字省略
  31. double类型和int类型相加,强制转换为double类型
  32.  int a=3,b=3,c=1; !(a+b)-c=-1//要注意!是加给括号的
    Turbo C中int类型变量的字节数为2
  33. oxff是不合法的十六进制数字:牢记十六进制的第一个必须是0而不是o
  34. C语言简单的数据类型为:整型,实型,字符型
  35. 计算机语言的发展历史:二进制语言——>汇编语言(用助记符来表示二进制语言)——>B语言——>高级语言
  36. 局部变量和全局变量同时存在的时候,局部变量优先。用extern来声明外部符号。>>为左移。
  37. scanf中%*3d意思是:输入3位十进制数字不够的话在前面补*  与%03d类似
  38.  int a=2;当a-=a+=a*a求解后的a的值0//注意a的值在+=之后会变化
  39. int x=2;  x=x+1/x-x++的值为1
  40. C语言的源程序经过编译形成的二进制代码不可以直接运行,每条语句最后都会转换为二进制代码。
  41. C语言编写的程序是一个源程序,必须经过编译链接之后才可以运行。
  42. C语言简单的数据类型包括整型,实型,字符型,不包括逻辑型
  43. ‘y=’是不合法的字符串量
  44. m=(k+=i*=k)    i=i*k,i的值改变 然后算k+=i=>k=k+i
  45. 交换:a=a+b,b=a-b,a=a-b
  46. ‘A'的ascii码值为65
  47. 若x=3.2,则++x后为4.2
  48. 函数体前面是声明部分,后面是执行部分
  49. C程序定义的变量相当于内存一组存储单元
  50. 一个字节表示的最大整数是255,二进制位是11111111,最小是-128,二进制为1000000
  51. scanf("%d%d%f",&a,&b,&c);//三种可能的方式:1<CR>2<CR>3<CR>  1 2<CR>3<CR> 1 2 3<CR>
  52. double转为int四舍五入,0.5也舍去,0.51进一位
  53. %mc 前面的 m为整形数字
    m的意义在于打印 默认分配给这个字符 几个字符位置 
    因为字符本来 就占有 一个位置 所以 %c 分配给字符一个打印为 是刚占满的
    但是 %4c 由于 字符本身只占有 一个位置 所以还空下三个位置 (这就要用空格来填充了)
     c语言默认是 右对齐的 所以在右边.打印出字符之后 会 顺势 输出三个空格来填充,
    至于 如果 想 让字符靠左对齐 那么 在%mc m 前面加个负号就可以啦 这样 %-4c 就是靠左对齐啦
  54. int  a=3,b=4,c=5;!((a<b)&&!c||1)//与大于或  结果为0
  55. 给变量赋初始值的时候,没有加static,默认为auto 型,此时,不给初值,变量的初值是随机的。
    如果加了static不给初值,变量的初值是默认的 0。
  56. 定义语句char c[5]={'a','b','\0','c','\0,};printf("%s",c);//得到ab c 
  57. func((exp1,exp2),(exp3,exp4,exp5));有俩个参数。逗号是一个运算符,其运算过程为依次计算左右操作数并返回右操作数的右值(即不可写值)。
  58. 在函数间通过全局变量的传递数据,只能用外部变量,不能用内部变量。
  59. 如果利用地址的返回值传递数据,返回值不能够赋给普通变量。
  60. 如果函数值的类型和返回值的类型不一样,以数据类型为准
  61. 实参类型和形参类型不一致,会转化为形参
  62. 有符号数就是最高位为符号位,0代表正数,1代表负数

    无符号数最高位不是符号位,而就是数的一部分而已。

    1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码

    无符号数最小为0,不可能是负数.%u,输出一个10进制的无符号数.

    %d是输出一个有符号的10进制int类型

  63. getchar接受一个字符,当接受的不为字符的时候,返回EOF

  64. 用gets输入字符串,用scanf不能获取空格,默认遇到空格 tab 换行符停止、%0m*l表示m为输入的宽度,0表示字符数不足m的时候用0补齐。*表示这个输入忽略,不占用任何内存。

(三)选择题

 若有定义:double a,b; int w; long c;且各个变量已经赋值正确,则合法的C语言标识为:

  A.a=a+b=b++   B.w%((int)a+b)  C.(3*a*d)/(b*c)  D.(c+w)%(a+b)   

解析:b++只对整型变量。%俩边必须都是整数。所以选C

猜你喜欢

转载自blog.csdn.net/m0_63203388/article/details/121674536