易错点
C 语言中易犯的错误
对初学C语言的人来说,经常会出一些
连自己都不知道错在哪里的错误?看着有错的程序,不知该如何改起,一些C编程时常犯的错误,写给各位学员以供参考?
********************************
********************************
************************
1.书写标识符时,忽略了大小写字母的区别.
mai n()
{
int a=5;
prin tf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息.
C认为大写字母和小写字母是两个不
同的字符?习惯上,符号常量
名用大写,变量名用小写表示,以增加可读性.
********************************
********************************
************************
2.忽略了变量的类型,进行了不合法的运算.
mai n()
{
float a,b;
prin tf("%d",a%b);
}
%是求余运算,得到a/b的整余数.整型变量a和b可以进行求余运算,而实型变量则不允许进行"求余"运算?
********************************
******************************** ************************ 3.将字符常量与字符串常量混淆?
char c;
c="a";
在这里就混淆了字符常量与字符串
常量,字符常量是由一对单
引号括起来的单个字符,字符串常量是一对双引号括起来的字符序
列.C规定以"\"作字符串结束标志,它是由系统自动加上的,所
以字符串"a"实际上包含两个字
符:'a'和'\',而把它赋给一
个字符变量是不行的?
********************************
******************************** ************************ 4.忽略了"="与"=="的区别.
在许多高级语言中,用"="符号作为
关系运算符"等于".
如在BASIC程序中可以写
if (a=3) then …
但C语言中,"="是赋值运算符,"=="
是关系运算符?如:
if (a==3) a=b;
前者是进行比较,a是否和3相等,后
者表示如果a和3相等,把
b值赋给a.由于习惯问题,初学者往往会犯这样的错误?
********************************
******************************** ************************
5.忘记加分号.
分号是C语句中不可缺少的一部分,语句末尾必须有分号.
a=1
b=2
编译时,编译程序在"a=1"后面没发
现分号,就把下一行"b
=2"也作为上一行语句的一部分,这就
会出现语法错误.改错时,
有时在被指出有错的一行中未发现错误,就需要看一下上一行是否
漏掉了分号.
{
z=x+y;
t=z/100;
prin tf("%f",t);
}
对于复合语句来说,最后一个语句
中最后的分号不能忽略不写
********************************
******************************** ************************
6.多加分号.
对于一个复合语句,如:t=z/100;
prin tf("%f",t);
};
复合语句的花括号后不应再加分号
否则将会画蛇添足.
又如:
if (a%3==0);
I++;
本是如果3整除a,则I加1.但由于
if (a%3==0)后多加了分号
,则if语句到此结束,程序将执行I++
语句,不论3是否整除a,I都
将自动加1.
再如:
for (I=0;I<5;I++);
{sea nf("%d", &x);
prin tf("%d",x);}
本意是先后输入5个数,每输入一个
数后再将它输出.由于for
()后多加了一个分号,使循环体变为空语句,此时只能输入一个数
并输出它.
******************************** ******************************** ************************
7.输入变量时忘记加地址运算符"&".
int a,b;
sea nf("%d%d",a,b);
{ z=x+y;
这是不合法的.Seanf函数的作用是
b的值存进去."&a"指a在内存中的地址.
********************************
******************************** ************************
8.输入数据的方式与要求不符?
①scan f("%d%d",&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车
键,跳格键tab.
②scan f("%d,%d",&a,&b);
C规定:如果在"格式控制"字符串中除了格式说明以外还有其它
字符,则在输入数据时应输入与这些字符相同的字符?下面输入是
合法的:
3,4
此时不用逗号而用空格或其它字符是不对的.
3 4 3:4
又如:
******************************** ******************************** ************************9.输入字符的格式与要求不一致?
在用"%c"格式输入字符时,"空格字符"和"转义字符"都作为有效字符输入.
sca nf("%c%c%c",&c1,&c2,&c3);
如输入a b c
字符"a"送给c1,字符""送给c2,字符"b"送给c3,因为%c
只要求读入一个字符,后面不需要用空格作为两个字符的间隔?
********************************
******************************** ************************ 10.输入输出的数据类型与所用格式说明符不一致.
例如,a已定义为整型,b定义为实型
a=3;b=4.5;
prin tf("%f%d\n",a,b);
编译时不给出出错信息,但运行结果将与原意不符?这种错误尤其
需要注意?
********************************
******************************** ************************
按照a,b在内存的地址将a, 输入应如以下形式
a=3,b=4
11.输入数据时,企图规定精度?
规定精度?
********************************
******************************** ************************ 12.switch 语句中漏写break语句.
例如:根据考试成绩的等级打印出百分制数段?
switch(grade)
{ case 'A':pri ntf("85~100\n");
case 'B':pri ntf("70~84\n");
case C:pri ntf("60~69\n");
case 'D':pri ntf("<60\n");
default:pri ntf("error\n");
由于漏写了break语句,case只起标号的作用,而不起判断作用?
因此,当grade值为A时,printf 函数在执行完第一个语句后接着执
行第二,三,四,五个printf函数语句. 正确写法应在每个分支后
再加上"break;".例如
case C:pri ntf("60~69\n");break;
********************************
******************************** ************************ 13.忽视了while和do-while 语句在细节上的区别.
(1)mai n()
{int a=0,I;
sca nf("%d",&I); while(l<=10)
{a=a+I;
I++;
}
prin tf("%d",a); }
(2)mai n()
{int a=0,I;
sca nf("%d",&l); do
{a=a+I;
I++;
}while(I<=10); prin tf("%d",a); }
sca nf("a=%d,b=%d",&a,&b);
sca nf("%7.2f",&a);
这样做是不合法的,输入数据时不能
可以看到,当输入I的值小于或等于10 时,二者得到的结果相同?
而当I>10时,二者结果就不同了?因为while循环是先判断后执行
,而do-while循环是先执行后判断.对于大于10的数while循环一
次也不执行循环体,而do-while语句则要执行一次循环体.
******************************** ******************************** ************************
14.定义数组时误用变量int n;
sea nf("%d",&n);
int a[n];
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常
量.即C不允许对数组的大小作动态定义.
********************************
******************************** ************************ 15.在定义数组时,将定义的"元素个数"误认为是可使的最大下
标值?
mai n()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
prin tf("%d",a[10]);
}
C语言规定:定义时用a[10],表示a数
组有10个元素.其下标值由0 开始,所以数组元素a[10]是不存在的.
********************************
********************************
************************
16.初始化数组时,未使用静态存储.
int a[3]={0,1,2};
这样初始化数组是不对的.C语言规定
只有静态存储(static)数组
和外部存储
(exterm)数组才能初始化.应改为:
static int a[3]={0,1,2};
********************************
******************************** ************************ 17.在不应加地址运算符&的位置加了地址运算符.
sca nf("%s",&str);
C语言编译系统对数组名的处理是:数
组名代表该数组的起始地址
,且scanf函数中的输入项是字符数组名,不必要再加地址符&应改为:sca
nf("%s",str);
********************************
********************************
************************
18.同时定义了形参和函数中的局部变量.
int max(x,y) int x,y, z;
{z=x>y?x:y;
return(z);
}
选择题1.下列字符序列中,不可用作C语言标识符的是()。 A.abc123 B.C._123_ D._ok 2.请选出可用作C语言用户标识符的一组标识符()。 A.void B.a3_b3 C.For D.2a define _123 -abc DO WORD IF Case sizeof 3.不属于C语言关键字的是()。 A.int B.break C.while D.character 4.以下不能定义为用户标示符的是()。 A.scanf B.Void C._3com_ D.int 5.C语言程序的基本单位是()。 A.程序行B.语句C.函数D.字符 6.以下说法中正确的是()。 A.C语言程序总是从第一个定义的函数开始执行 B.在C语言程序中,要调用的函数必须在main( )函数中定义 C.C语言程序总是从main( )函数开始执行 D.C语言程序中的main( )函数必须放在程序的开始部分 7.以下选项中,合法的用户标识符是()。 A.long B._2abc C.3dmax D. 8.已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示 的字符常量’\101’是()。 A.字符A B.字符a C.字符c D.非法的常量 9.以下选项中,正确的字符常量是()。 A.”F”B.’\\’’C.’W’D.’’ 10.下列变量定义中合法的是 A.short _a=; B.double b=1+; C.long do=0xfdaL; D.float 2_and=1-e-3; 11.为了避免嵌套的if-else语句的二义性,C语言规定else总是与()组成配对关系。 A.缩排位置相同的if B.在其之前未配对的if C.在其之前未配对的最近的if D.同一行上的if 12.下列运算符中优先级最高的是()。 A.< B.&& C.+ D.!= 13.判断char型变量s是否为小写字母的正确表达式是()。 A.’a’ <= s<=’z’B.(s>=’a’) & (s<=’z’) C.(s>=’a’) && (s<=’z’) D.(’a’<=s) and (’z’>=s)
《C语言程序设计》模拟试卷二 一、填空题。(每空2分,共30分) 1.设有变量说明语句 int x=1,y=2; 则执行下述printf语句的输出结果是______ _____。 printf("%f\n",1.0+x/y); 2.执行下述程序 #include } 4.设n 是整型变量,且已具有某正整数值。根据下述数学式 1 1 14131312121+? ++?+?+n n 求s 的值并输出。 可编写如下之程序段实现之。请填空。 int k; double s,d; s=0.0; d=1.0; K=0; do { s=s+d; ___ _________; d=1.0/(k*(k+1)); } while (k<=n); printf("%f\n",s); 5.执行下述程序的输出结果是____ ____。 #inclued 模拟试题二 一、选择题(本大题30分,每小题2分) 1.C语言中不能用来表示整常数的进制是。 A)十进制B)十六进制C)八进制D)二进制 2.C语言规定标识符由等字符组成。 A)字母数字下划线B)中划线字母数字 C)字母数字逗号D)字母下划线中划线 3.若有如下定义:int a=2,b=3; float x=3.5,y=2.5; 则表达式: (float)(a+b)/2+(int)x%(int)y的值是。 A)2.500000 B)3.500000 C)4.500000 D)5.000000 4.以下表达式: 2+?a?+i*f, 其中i为整型变量,f为float型变量,则表达式的最终数据类型为。 A)int B)float C)char D)double 5.有如下语句: printf(“%s,%5.3s\n”,“COMPUTER”,“COMPUTER”); 执行语句后的最终结果为。 A)COMPUTER ,CMP . B)COMPUTER, CMP. C)COMPU, CMP. D)COMPU, CMP . 6.以下if语句中语法错误的是。 A)if (a>b)printf(“%f”,a); B)if(a>b)printf(“%f”,a); else printf(“%f”,b); C)if(a>b)printf(“%f”,a) D)if(a>b)printf(“%f”,b); else printf(“%f”,b); else printf(“%f”,a); 7.能表示整数x符合下面两个条件的语句是。 (1)“能被4整除,但不能被100整除”.(2)能被4整除,又能被400整除. A)(x%4==0&&x%100!=0)||x%400==0 B)(x%4==0||x%100!=0)&&x%400==0 C)(x%4==0&&x%400!=0)||x%100==0 D)(x%100==0||x%4!=0)&&x%400==0 8.循环语句中的for语句,其一般形式如下: for(表达式1;表达式2;表达式3) 语句 其中表示循环条件的是。 A)表达式1 B)表达式2 C)表达式3 D)语句 9.以数组作为函数的参数时传递的数组的首地址,那么实参数组与形参数组之间的数据传递方式为。 A)地址传递B)单向值传递 C)双向值传递D)随机传递 10.将字符串str2连接到字符串str1中应使用。 A)strcpy(str1,str2) B)strcat(str1,str2) C)strcmp(str1,str2) D)strcat(str2,str1) 11.若有以下定义: int a[10],*p=a; 则*(p+3)表示的是。 A)元素a[3]的地址B)元素a[3]的值 C)元素a[4]的地址D)元素a[4]的值 12.若有如下语句: int *p1,*p2; 则其中int所指的是。 A)p1的类型B)*p1和*p2的类型 C)p2的类型D)p1和p2所能指向变量的类型 《C语言程序设计》期中考试试卷 课程编号:03402513试卷类型:A卷考试形式:笔试考试日期: 注意事项:1.请将试卷最后一页的答题纸撕下,将答案填写在其中;2.交卷时请确认答题纸是否按要求写好姓名等信息并与试题一起上交;3.不准携带任何书籍、资料、纸张等。4.草稿纸用试卷的背面。 一、单项选择题(1空1分,共20分) 1、C语言程序的基本结构是(【1】) 。 【1】 A) 函数 B) 语句 C) 字符 D) 程序行 2、一个C程序的执行是(【2】) 。 【2】A) 从本程序的主函数开始,到本程序的主函数结束 B)从本程序的第一个函数开始,到本程序的最后一个函数结束 C) 从本程序的主函数开始,到本程序的最后一个函数结束 D)从本程序的第一个函数开始,到本程序的主函数结束 3、下列四个叙述中,错误的是(【3】) 。 【3】 A) 一个C源程序必须有且只能有一个主函数 B) 一个C源程序可以含一个或多个子函数 C) 在C源程序中注释说明必须位于语句之后 D) C源程序的基本结构是函数 4、下面不属于C语言保留字的是(【4】) 。 【4】 A) short B) ELSE C) extern D) for 5、下列四个叙述中,正确的是(【5】) 。 【5】 A) 库函数也是C语言本身的组成部分 B) C语言中的输入输出操作是由相应语句完成的 C) 库函数是C编译系统提供的功能函数 D) 标题文件(头文件)可以在程序的函数内部调用 6、下列四组数据类型中,C语言允许的一组是(【6】)。 【6】 A) 整型、实型、逻辑型 B) 整型、实型、字符型 C) 整型、双精度型、布尔型 D) 整型、实型、复型 7、在C语言中不同数据类型的的长度是(【7】)。 【7】 A) 固定的 B) 由用户自己定义的 C) 任意的 D) 与机器字长有关 6.以下程序的输出结果为(D)。 main( ) { char c; int i; for(i=65;i<68;i++) { c=i+32; switch(c) { case ‘a’:printf("%c,",c);break; case ‘b’:case ‘e’:printf("ok,"); default: printf("end"); } } } A a,ok,end B a,ok,endend C a,ok,end,end D a,ok,ok 9.以下程序的输出结果为(B)。 #define A 3 #define B(a) (A+1)*a main() { int x; x=3*A+B(7); printf("x=%d\n",x); } A x=93 B x=37 C x=60 D x=90 三写出下列程序的运行结果(10分,每小题2分) 1.main( ) { char c1=‘A’,c2=‘\144’,c3=‘\x44’,c=0xf5,x=13,a; int i=0122,j=0xa4; printf(“c1=%c,c4=%c\tc5=%c\n”,c1,c2,c3); printf(“%d,%d\n”,i,j); i=-34; j=20; printf(“%d,%d,%d\n”,i%j,i&j<<2,sizeof(j)); printf(“c=%d\n”,c|x); a=c^x<<2; printf(“a=%d\n”,a); } 2.main() { int x,y=1,z=10; if(y!=0) x=5; printf(“x=%d\t”,x); x=1; if(z<0) if(y>0) x=3; else x=5; printf(“x=%d\n”,x); if(z=y<0) x=3; else if(y==0) x=5; else x=7; printf(“x=%d\t”,x); printf(“z=%d\n”,z); } 3.main( ) { char s[20]=“I like it.”,t[20]=“Are you?”,c[20]; int i=0; while(s[++i]!=‘\0’) t[i]=s[i]; t[i]=0; printf(“string s:%s\n”,s); printf(“string t:%s\n”,t); } 4.int i=5; main( ) { int i=3; { int i=10; i++; printf(“%d\n”,i); 本文由2009220176贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 语言程序设计》 《C 语言程序设计》模拟试卷二 一、填空题。(每空 2 分,共 30 分) 填空题。(每空 。( 1.设有变量说明语句 int x=1,y=2; 则执行下述 printf 语句的输出结果是 printf("%f\n",1.0+x/y); 2.执行下述程序 #include main() { int x,y; scanf("%2d%*2s%1d",&x,&y); printf("%d\n",x+y); } 若从键盘输入 12345671 则程序的输出结果是。 3.以下程序的功能是:从键盘上输入若干名学生的成绩(百分制,可带小数,以输入 负数或 0 为结束标志),统计并输出最高成绩和最低成绩。请填空。 #include main() { float x,amax,amin; scanf("%f",&x); amax=x; amin=x; while ( ) 。 { if (x>amax) amax=x; else if (x main() 。 { int a[6],i; for (i=0;i<6;i++) { a[i]=9*(i-2+4*(i>3))%5; printf("%3d",a[i]); } printf("\n"); } 6.执行下述程序时的输出结果是 #include main() { int a[]={2,4,6,},*ptr=&a[0],x=8,y,z; for (y=0;y<3;y++) z=(*(ptr+y)<x)?*(ptr+y):x; printf("%d\n",z); } 7.执行下述程序的输出结果是 #include main() { int a[][2]={10,20,30,40,50,60},(*p)[2]; p=a; printf("%d\n",*(*(p+2)+1)); } 8.执行以下程序的输出结果是 #include 。 。 。 main() { int s,i,sum(); for (i=1;i<=10;i++) s=sum(i); printf("s=%d\n",s); } sum(int k) { int x=0; return (x+=k); } 9.下述函数定义用来求出两个整数之和,并通过函数的模拟传地址调用,传回两整 数相加之和值,请填空。 void add(int x,int y, { *z=x+y; } 10.函数 func 的功能是将整型变量 x 的值转换成二进制数,并将该二进制数的每一 位存入由整型指针 b 所指向的一维数组 a,最低位存放于 a[0]中, 次低位存放于 a[1] 中,依此类推。请填空。 void func(int x,int *b) { int r; do { r=x%2; =r; ) x/=2; } while (x); } 11.以下程序中函数 invert 实现将数组内所有数组元素的值逆置。比如,执行本程 序将输出 10 9 8 7 6 5 4 3 2 1 请填空。 #include main() { int a[10]={1,2,3,4,5,6,7,8,9,10},i,n=10; invert(a,n-1); for (i=0;i<10;i++) printf("%3d”,a[i]); printf("\n"); } invert(int *s,int num) { int *t,k; t=s+num; while ( { k=*s; *s=*t; *t=k; s++; t--; } ) } 12.若有以下定义和说明,则结构体变量 w 在内存中所占的字节数是 union aa { float x; float y; char c[6]; }; struct st { union aa v; float w[5]; double ave; } w; 13.执行下述程序的输出结果是 #include struct str { float x; char *y; } *m; struct str group[3]={ 95.0,"Li", 82.5,"Wang", 73.5,"Sun" }; main() { m=group; printf("%.lf,%s\n",m->x,m->y); } 。 14.下面的程序用来统计某文件文件中字符的个数。请填空。 #include #include main() { FILE *fp; long num=0; if ((fp=fopen("fnam.dat","r"))==NULL) { printf("Can't open this file!\n"); exit(0); } while ( { fgetc(fp); num++; } printf("num=%d\n",num); fclose(fp); } 15.执行下述程序后,输出结果为 。 #include #define FUN1(a,b) a+b #define FUN2(a,b) a-b #define CAL(a,b) a*b+a+3 main() { printf("%d\n",CAL(FUN1(3,5),FUN2(4,5))); } ) 二、单项选择题。(每题 1 分,共 20 分) 单项选择题。(每题 。( 1.以下不是 c 语言规定保留字的是( (A)float (B)integer )。 (D) unsigned ) (C)signed 2.设 int 型变量 x 有初始值 3,则表达式 x++*5/10 的值是( (A)0 (B)1 (C)2 ) (D)3 3.下述程序执行后的输出结果是( #include main() { int x='f'; printf("%c\n",'a'+(x-'a'+1)); } (A)g 4.设有程序 #include main() { int i,j; for (i=0,j=1;i<=j+1;i+=2,j--) printf("%d\n",i); } (B)h (C)i (D)j 在运行上述程序时,for 语句中循环体的执行次数是( (A)3 (B)2 (C)1 (D)0 )C语言模拟试题二
c语言期中考试试题及答案
大一C语言期末考试试题
C语言程序设计模拟试题2(附答案)new
大一C语言期末考试题