C语言典型易错题

合集下载

C语言易错题

C语言易错题

D.7
C.8
D.7
i=f(4+4)/f(2+2); printf("%d\n",i); } A.28 B.64 C.4 D.3
36. 有以下程序执行后输出结果是 #include <stdio.h> struct STU {char name[10]; int num; int score; }; main() {struct STU s[5]={{"YangSan",0041,703},{"LiSiguo",0042,580},{"WangYin", 0043,680},{"Sundan",0044,550},{"PengHua",0045,537}},*p[5],*t; int i,j; for(i=0;i<5;i++) p[i]=&s[i]; for(i=0;i<4;i++) for(j=i+1;j<5;j++) if(p[i]->score > p[j]->score) {t=p[i];p[i]=p[j];p[j]=t;} printf("%d %d\n",s[1].score,(*p[1]).score); } A.550 550 B.680 680 C.580 550 D.580 680 37.下面程序的运行结果是: int f(int a[],int n) {if(n>1) return a[0]+f(&a[1],n-1); else return a[0]; } main() {int aa[3]={1,2,3},s; s=f(&aa[0],3); printf("%d\n",s); } 答案: 6 38.结构化程序有三种基本结构组成,三种基本结构组成的算法: A. 可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完成符合结构化的任务 D. 只能完成一些简单的任务 39.有以下程序运行后输出结果是 main() {int a[]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a+5,*q;

c语言错题总结期末

c语言错题总结期末

c语言错题总结期末一、变量与表达式1. 以下语句的输出是什么?```c#include <stdio.h>int main(){int a = 2, b = 3;printf("a*3+5*b = %d", a*3+5*b);return 0;}```答案:a*3+5*b的值是21。

解析:根据运算符的优先级,先进行乘法运算,然后进行加法运算。

2. 下面代码的输出是什么?```c#include <stdio.h>int main(){int a = 3, b = 4, c = 5;printf("a + b - c = %d\n", a + b - c);printf("a * b / c = %d\n", a * b / c);printf("a + b * c = %d\n", a + b * c);return 0;}```答案:```a +b -c = 2a *b /c = 2a +b *c = 23```解析:根据运算符的优先级,先进行乘法运算,然后进行加法和减法运算。

二、流程控制1. 下面哪个循环语句可以用来反复执行一段代码块,直到满足某个条件时停止执行?A. ifB. switchC. whileD. for答案:C. while解析:while循环可以根据给定的条件反复执行一段代码块,直到条件不再满足时停止执行。

2. 下面的代码片段输出结果是什么?```c#include <stdio.h>int main(){int i = 0;while(i < 3){printf("%d ", i);i++;}return 0;}```答案:输出结果是0 1 2 。

解析:while循环的终止条件是i小于3,所以循环会执行3次,i的初始值为0,每次循环后i会自增1。

c语言易错题目及其解析

c语言易错题目及其解析

c语言易错题目及其解析答:死循环是指程序进入一个无限循环的状态,无法正常结束。

造成死循环的情况可能包括以下几种:- 循环条件永远为真,如while(1)- 循环变量未被改变,导致循环一直执行同一次- 函数调用自身,形成递归调用但没有递归结束条件- 程序逻辑出现错误,导致循环无法正常退出2. 下面代码的输出结果是什么?```cint a = 1;if(a++ == 1)printf('a=%d', a);elseprintf('a=%d', ++a);```答:输出结果为a=2。

这是因为if语句中的条件表达式使用了后自增运算符,会先用变量a的值进行比较,再将a的值加1。

因此,if语句中的条件表达式为假,else语句执行,a的值先加1再输出。

3. 下面代码的输出结果是什么?```cchar str[] = 'abc';printf('%s', str);```答:输出结果为abc。

这是因为printf函数的%s格式化符号可以输出一个字符串,而在C语言中,字符数组也可以看作是一个字符串。

4. 下面代码的输出结果是什么?```cint a = 3, b = 4;printf('%d', a+b);printf('%d', 'a+b');```答:第一行输出结果为7,第二行会出现编译错误。

这是因为第二行使用了双引号将a+b括起来,使其变成了一个字符串常量,而printf函数的%d格式化符号无法输出字符串。

5. 下面代码的输出结果是什么?```cint a = 10;float b = 3.1415;printf('%f', a/b);```答:输出结果为3.183099。

这是因为当进行算术运算时,如果参与运算的类型不同,C语言会进行自动类型转换。

在这个例子中,整型的a被强制转换成了浮点型,然后与浮点型的b进行了除法运算,得到的结果为浮点型。

大一C语言易错点总结和模拟试题带答案

大一C语言易错点总结和模拟试题带答案

易错点C语言中易犯的错误对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,一些C编程时常犯的错误,写给各位学员以供参考.******************************** ******************************** ************************1.书写标识符时,忽略了大小写字母的区别.main(){int a=5;printf("%d",A);}编译程序把a和A认为是两个不同的变量名,而显示出错信息.C认为大写字母和小写字母是两个不同的字符.习惯上,符号常量名用大写,变量名用小写表示,以增加可读性.******************************** ******************************** ************************2.忽略了变量的类型,进行了不合法的运算.main(){float a,b;printf("%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=1b=2编译时,编译程序在"a=1"后面没发现分号,就把下一行"b=2"也作为上一行语句的一部分,这就会出现语法错误.改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号.{z=x+y;t=z/100;printf("%f",t);}对于复合语句来说,最后一个语句中最后的分号不能忽略不写******************************** ******************************** ************************6.多加分号.对于一个复合语句,如:{z=x+y; t=z/100;printf("%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++);{scanf("%d",&x);printf("%d",x);}本意是先后输入5个数,每输入一个数后再将它输出.由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它.****************************************************************************************7.输入变量时忘记加地址运算符"&".int a,b;scanf("%d%d",a,b);这是不合法的.Scanf函数的作用是:按照a,b在内存的地址将a,b的值存进去."&a"指a在内存中的地址.******************************** ******************************** ************************8.输入数据的方式与要求不符.①scanf("%d%d",&a,&b);输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:3,4输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab.②scanf("%d,%d",&a,&b);C规定:如果在"格式控制"字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符.下面输入是合法的:3,4此时不用逗号而用空格或其它字符是不对的.3 43:4又如:scanf("a=%d,b=%d",&a,&b); 输入应如以下形式:a=3,b=4****************************************************************************************9.输入字符的格式与要求不一致.在用"%c"格式输入字符时,"空格字符"和"转义字符"都作为有效字符输入.scanf("%c%c%c",&c1,&c2,&c3);如输入a b c字符"a"送给c1,字符" "送给c2,字符"b"送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔.****************************************************************************************10.输入输出的数据类型与所用格式说明符不一致.例如,a已定义为整型,b定义为实型a=3;b=4.5;printf("%f%d\n",a,b);编译时不给出出错信息,但运行结果将与原意不符.这种错误尤其需要注意.****************************************************************************************11.输入数据时,企图规定精度.scanf("%7.2f",&a);这样做是不合法的,输入数据时不能规定精度.****************************************************************************************12.switch语句中漏写break语句.例如:根据考试成绩的等级打印出百分制数段.switch(grade){ case 'A':printf("85~100\n"); case 'B':printf("70~84\n");case 'C':printf("60~69\n");case 'D':printf("<60\n"); default:printf("error\n");由于漏写了break语句,case只起标号的作用,而不起判断作用.因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二,三,四,五个printf函数语句.正确写法应在每个分支后再加上"break;".例如case 'C':printf("60~69\n");break; ****************************************************************************************13.忽视了while和do-while语句在细节上的区别.(1)main(){int a=0,I;scanf("%d",&I); while(I<=10){a=a+I;I++;}printf("%d",a);}(2)main(){int a=0,I;scanf("%d",&I);do{a=a+I;I++;}while(I<=10);printf("%d",a);}可以看到,当输入I的值小于或等于10时,二者得到的结果相同.而当I>10时,二者结果就不同了.因为while循环是先判断后执行,而do-while循环是先执行后判断.对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体.******************************** ******************************************************** 14.定义数组时误用变量. int n; scanf("%d",&n); int a[n]; 数组名后用方括号括起来的是常量表达式,可以包括常量和符号常 量.即C 不允许对数组的大小作动态定义. **************************************************************************************** 15.在定义数组时,将定义的"元素个数"误认为是可使的最大下 标值. main() {static int a[10]={1,2,3,4,5,6,7,8,9,10}; printf("%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.在不应加地址运算符&的位置加了地址运算符. scanf("%s",&str); C 语言编译系统对数组名的处理是:数组名代表该数组的起始地址 ,且scanf 函数中的输入项是字符数组名,不必要再加地址符&.应 改为:scanf("%s",str); **************************************************************************************** 18.同时定义了形参和函数中的局部变量. int max(x,y) int x,y,z; {z=x>y?x:y; return(z); } 形参应该在函数体外定义,而局部变量应该在函数体内定义.应改 为: int max(x,y)int x,y;{int z;z=x>y?x:y;return(z);}试题一一、单项选择题(共30分,每题1分)1. 下列不正确的转义字符是A.\\B.\‘ C.074 D.\02. 不是C语言提供的合法关键字是A.switchB.cherC.caseD.default3.正确的标识符是()A.?a B.a=2 C.a.3 D.a_34.下列字符中属于键盘符号的是A.\ B.\n C.\t D.\b.下列数据中属于“字符串常量”的A.ABC B.“ABC” C.‘ABC’ D.‘A’6.char型常量在内存中存放的是A.ASCII码B.BCD码C.内码值D.十进制代码值7.设a为5,执行下列语句后,b 的值不为2的是()A.b=a/2B.b=6-(——a) C.b=a%2 D.b=a>3?2:28.在以下一组运算符中,优先级最高的运算符是()A.<= B.= C.% D.& &9.设整型变量i的值为3,则计算表达式i——i后表达式的值是()A.0B.1C. 2D.表达式出错10.设整型变量a,b,c均为2,表达式a+++b+++c++的结果是()A.6B.9C.8D.表达式出错11.若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是()A.1B.2C.2.0D.2.512.设a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d的结果是()A.4B.3C.2D.113.设a为整型变量,不能正确表达数学关系:10<a<15的C语言表达式是()A.10<a<15B.a==11 || a= =12 || a= =13 || a= =14C.a>10&&a<15D.!(a<=10)&&!(a>=15)14.若有以下定义:char a、 intb 、 floatc 、 double d,则表达式a*b+d-c值的类型为()A.floatB.intC.charD.double15.表达式“10!=9”的值是()A.trueB.非零值 C.0 D.116.循环语句 for (x=0,y=0;(y!=123)|| (x<4);x++);的循环执行()A.无限次B.不确定次 C.4次 D.3次17.在C语言中,下列说法中正确的是()A. 不能使用“do while”的循环B.“do while”的循环必须使用break语句退出循环C.“do while”的循环中,当条件为非0时将结束循环D.“do while”的循环中,当条件为0时将结束循环。

各公司C语言笔试频繁易错题

各公司C语言笔试频繁易错题

2布尔变量,整型变量,浮点变量与零值得比较方法(flag)
布尔型:if(flag)
整形:if(flag==0)
浮点型:Define EPSILON0.000000001
if ( fabs(a-b) <= EPSILON )
3.软件开发过程分为:需求分析、设计、编码、测试4个阶段。

5.strcpy的原函数
6.用来求一个十进制数转换成二进制后有多少个1
7,软件设计中划分模块的准则是高内聚,低耦合。

8,赋值表达式(研华)
9.研华(数据指针以及存储)
10,字节范围表达
11,数组的旋转填充。

顺时针填充数字(n*n)
12,指针加1搜代表的含义
13,结构体所占存储空间
6,12
14,关键字static的作用:
1)对局部变量使用static声明,则使得该变量在整个程序执行期间不释放,
为其分配的空间始终存在。

2)全局变量用static声明,则该变量只限于本文件模块(声明所在的文件15,指针
gh int *p[4]:p是存有4个指向整型数据的指针
int(*p)[4]:p是指向有四个数据的一维数组的指针
16.不同类型的数据占用的内存
17,函数调用形参仅仅是值传递
test。

c语言 经典易错题

c语言 经典易错题

c语言经典易错题在学习C语言的过程中,我们经常会遇到一些经典的易错题。

这些题目看似简单,但往往会隐藏一些陷阱。

下面我将介绍一些常见的C 语言易错题,并通过详细的解析帮助大家更好地理解和掌握。

题目一:```c#include <stdio.h>int main() {int a = 5, b = 3;a = b++;printf("a=%d, b=%d\n", a, b);return 0;}```在上面的代码中,我们定义了两个变量a和b,并且使用后置递增操作符将b赋值给a。

最后通过printf函数打印出a和b的值。

请问,代码执行后a和b的值分别是多少?解析:在执行 `a = b++` 这一行代码时,先将 `b` 的值赋给 `a`,然后再将`b` 自身进行自增操作。

`b++` 的返回值是原始的 `b` 的值,在本例中即为 `3`。

所以执行完这一行代码后,`a` 的值为 `3`,`b` 的值为 `4`。

因此,最后打印出的结果是 `a=3, b=4`。

题目二:```c#include <stdio.h>int main() {int a = 5, b = 3;a = ++b;printf("a=%d, b=%d\n", a, b);return 0;}```与题目一类似,下面的这段代码中我们只是将递增操作符从后置变为前置。

请问,代码执行后a和b的值分别是多少?解析:在执行 `a = ++b` 这一行代码时,先对 `b` 进行自增操作,然后再将自增后的 `b` 的值赋给 `a`。

`++b` 的返回值就是自增后的 `b` 的值,在本例中即为 `4`。

所以执行完这一行代码后,`a` 的值为 `4`,`b` 的值也为 `4`。

因此,最后打印出的结果是 `a=4, b=4`。

题目三:```c#include <stdio.h>int main() {int a = 5, b = 3;int c = a++ + ++b;printf("a=%d, b=%d, c=%d\n", a, b, c);return 0;}```在上面的代码中,我们定义了三个变量a、b和c,并使用了后置递增和前置递增操作符。

15个c语言易犯错误

15个c语言易犯错误

陷阱1:忽略大小写的区别1#include<stdio.h>2void main()3{4int a=10;5a+=a;6printf("%d\n",A);7}复制代码这个很简单,是基础,c语言变量区分大小写。

代码中的a与A不是同个变量,编译出现A 没定义的错误。

陷阱2:“{}”与“()”使用不当造成错误8#include <stdio.h>9void main()10{11int i,j;12int a[2][3]={(1,2,3),(4,5,6)};13printf("array a:\n");14for(i=0;i<=1;i++)15{16for(j=0;j<=2;j++)17{18printf("%d",a[i][j]);19}20printf("\n");21}22}2324}复制代码程序结果不能正常输出数组每个元素,编译{(1,2,3),(4,5,6)};时,先进行括号内的逗号运算(取逗号最后的数值),编译生成{3,6};其它元素为0。

正确的写法:{{1,2,3},{4,5,6}};陷阱3:在if,while,#include,#define,for后直接加分号,如for(int a=1;a<10;a++);如果是while,程序一般执行死循环,int a=1;while(a);如果是if,判断语句无效果,比如。

if(a>0);a=-1;无论a是否大于0,结果都是a=-1;如果是#include,程序编译的时候提示错误,无法引用库文件;如果是#define,比如#define a 200;程序在预编译的时候,200;包括分号一同被替换进程序,程序不可能正常编译如果是for循环,跟if一样,事与愿违,循环做无用功,本想循环的printf语句只执行一次。

for(int a=1;a<10;a++);printf("%d",a);程序只输出一次a值。

c语言易错题总结

c语言易错题总结

C语言易错题总结
1. **变量未初始化**:在使用变量之前,一定要先进行初始化,否则其值是随机的,可能会导致程序出现错误的结果。

2. **数组越界**:C语言中数组的下标是从0开始的,因此,一个长度为n的数组的有效下标范围是[0, n-1]。

如果试图访问超出这个范围的下标,就会导致数组越界错误。

3. **类型转换错误**:在C语言中,需要进行显式类型转换。

如果不进行显式转换,可能会导致数据丢失或者结果不符合预期。

4. **逻辑错误**:这类错误比较隐蔽,通常是由于代码中的逻辑错误导致的。

例如,条件判断错误、循环控制错误等。

5. **指针错误**:指针是C语言中的一大难点,也是常见的错误来源。

常见的指针错误包括指针未初始化、野指针、指针越界等。

6. **内存泄漏**:在C语言中,需要手动管理内存。

如果在使用完内存后没有及时释放,就会导致内存泄漏。

7. **函数返回值未检查**:在调用函数时,一定要检查函数的返回值,以确定函数是否执行成功。

如果忽略了返回值检查,可能会导致程序出现错误。

8. **文件操作错误**:在进行文件操作时,如果文件不存在或者无法打开,就会导致文件操作错误。

在进行文件操作时,一定要先检查文件是否存在并且可读。

9. **语法错误**:这类错误是最常见的,通常是由于拼写错误、缺少分号、括号不匹配等原因导致的。

以上就是C语言中常见的一些易错题类型,为了避免这些错误,需要仔细检查代码,并养成良好的编程习惯。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言典型易错题
(1)以下程序段中的变量已正确定义
For(i=0;i<4;i++,i++)
For(k=1;k<3;k++);printf(“*”);
程序段的输出结果是()
A********B****
C**D*
解析:注意第二个for后执行语句为空,故答案为D。

(2)有以下程序
#include<stdio.h>
V oid f(int*p,int*q);
Main()
{int m=1,n=2,*r=&m;
f(r,&n);printf(“%d,%d,m,n);
}
V oid f(int*p,int*q)
{p=p+1;*q=*q+1;}
程序运行后的输出结果是()
A1,3B2,3C1,4D1,2
解析:注意C语言中函数的值传递规律,故答案为A。

(3)有以下程序
#include<stdio.h>
Int b=2;
Int fun(int*k)
{b=*k+b;return(b);}
Main
{int a[10]={1,2,3,4,5,6,7,8},i;
For(i=2;i<4;i++)
{b=fun(&a[i])+b;printf(“%d”,b);}
Printf(“\n”);
}
程序运行后的输出结果是()
A1012B810C1028D1016
解析:b是全局变量,当b=2时,i<4符合,执行b=fun(&a[i])+b对于fun(&a[i])得b=a[2]+2=5
所以b=b+b=10
i++,i=3,i<4符合fun(&a[i]),得b=a[3]+10=14,b=b+b=28所以答案是C
(4)若变量已正确定义,有以下程序段
Int a=3,b=5,c=7;
If(a>b)a=b;c=a;
If(c!=a)c=b;
Printf(“%d,%d,%d\n”,a,b,c);
其输出结果是()
A程序语段有语法错误B3,5,3
C3,5,5D3,5,7
解析:注意第一个If语句之后的分号,c=a是不属于If语句的,故答案为B。

(5)假定a和b为int型变量,则执行以下语句后的值为()
a=1;
b=10;
do
{b-=a;a++;
}while(b--<0);
A9B-2C-1D8
解析:对于do……while循环来说,先执行循环体再判断,条件不满足时退出循环。

故答案为D。

(6)有如下程序段
#include<stdio.h>
#define PT5.5
#define S(x)PT*x*x
Main()
{int a=1,b=2;
Printf(“%4.1f\n”,S(a+b));
}
该程序的输出结果是()
A49.9B9.5C22.0D45.0
解析:函数调用时是先求出实参表达式的值,然后代入形参,但是使用带参数的宏只是进行简单的字符替换,故答案为B。

相关文档
最新文档