C语言易错题
- 格式:pdf
- 大小:122.40 KB
- 文档页数:10
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语言易错题目及其解析答:死循环是指程序进入一个无限循环的状态,无法正常结束。
造成死循环的情况可能包括以下几种:- 循环条件永远为真,如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编程时常犯的错误,写给各位学员以供参考.******************************** ******************************** ************************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时将结束循环。
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#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,并使用了后置递增和前置递增操作符。
以下各个项中,可作为C语言中合法整数的是( )。
A.10110BB.0386C.0XffaD.x2a2错解:B 错认为是十进制整形数据,开头为0,后面无意义。
整形常量:十进制 +(-)0—9八进制 +(-)O 0—7十六进制 +(-)OX 0—f或OX 0—F在输出是不会输出前导符。
下列定义变量的语句中错误的是()A.int _int;B.double int_;C.char For;D.float US$;正解:D 变量格式:数据类型名(整型、实型、字符型)+变量名变量名即格式字符属于标识符(符号常量名、函数名、数组名、文件名)由有效字符序列组成:字母、数字、下划线,且第一个字符不能是数字,另外C语言中大小写字母不等效。
设有定义:int a; float b; ,执行scanf("%2d%f",&a,&b);语句时,若从键盘输入876 <空格>543.0<回车>,则a和b的值分别是()A.87 和 6.00000B.876 和 543.0C.87 和 543.0D.76 和 543.0正解:%2d决定了a只能接受两位数字,所以a的值为87%2d%f是连在一起的,所以按照默认规定,输入的数据也是连续的,中间没有空格,否则会将空格作为输入的结束符来看待。
已知字符 'a' 的ASCII码为 97,执行下列语句的输出是____。
printf ("%d, %c", 'b', 'b'+1 ) ;A.98,bB.语法不合法C.98,99D.98,c正解:C.字符数据在内存中以ASCII码存储,因此字符数据和整型数据可以通用,可相互赋值。
有以下程序:main(){int m=0256, n=256;printf("%o %o\n", m, n);}运行程序后的输出结果是( )A.0256 0400B.0256 256C.256 400D.400 400错解:A. %O输出结果无前导符符号,若输出需要带上前导符,则应该为%#O,同理十六进制输出前导符为%#OX。
陷阱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语言易错题总结
1. **变量未初始化**:在使用变量之前,一定要先进行初始化,否则其值是随机的,可能会导致程序出现错误的结果。
2. **数组越界**:C语言中数组的下标是从0开始的,因此,一个长度为n的数组的有效下标范围是[0, n-1]。
如果试图访问超出这个范围的下标,就会导致数组越界错误。
3. **类型转换错误**:在C语言中,需要进行显式类型转换。
如果不进行显式转换,可能会导致数据丢失或者结果不符合预期。
4. **逻辑错误**:这类错误比较隐蔽,通常是由于代码中的逻辑错误导致的。
例如,条件判断错误、循环控制错误等。
5. **指针错误**:指针是C语言中的一大难点,也是常见的错误来源。
常见的指针错误包括指针未初始化、野指针、指针越界等。
6. **内存泄漏**:在C语言中,需要手动管理内存。
如果在使用完内存后没有及时释放,就会导致内存泄漏。
7. **函数返回值未检查**:在调用函数时,一定要检查函数的返回值,以确定函数是否执行成功。
如果忽略了返回值检查,可能会导致程序出现错误。
8. **文件操作错误**:在进行文件操作时,如果文件不存在或者无法打开,就会导致文件操作错误。
在进行文件操作时,一定要先检查文件是否存在并且可读。
9. **语法错误**:这类错误是最常见的,通常是由于拼写错误、缺少分号、括号不匹配等原因导致的。
以上就是C语言中常见的一些易错题类型,为了避免这些错误,需要仔细检查代码,并养成良好的编程习惯。
当涉及到易错题时,以下是一些常见的C语言易错题及其解析:1. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {int x = 5;printf("%d", x++);return 0;}```答案:该代码的输出结果是5。
这是因为`x++`是后置递增操作符,它会先使用变量的当前值,然后再将其递增。
2. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {int x = 10;if (x = 5) {printf("Hello");} else {printf("World");}return 0;}```答案:该代码的输出结果是"Hello"。
这是因为在条件语句中使用了赋值操作符`=`而不是相等操作符`==`。
因此,表达式`x = 5`会将5赋值给变量x,并且由于赋值操作的结果为非零值,条件判断为真。
3. 下面代码的输出结果是什么?```c#include <stdio.h>int main() {char str[] = "Hello";printf("%c", str[5]);return 0;}```答案:该代码会导致未定义的行为。
数组下标从0开始计数,而`str`数组的长度为6(包括结尾的空字符'\0')。
因此,`str[5]`尝试访问越界的内存位置,导致未定义的行为。
这些是一些常见的C语言易错题,通过理解和注意这些概念,可以帮助避免在编写C 代码时出现常见的错误。
同时,建议在学习过程中多做练习题,加深对C语言的理解和运用。
c语言编程易错题一、引言C语言是一种广泛使用的编程语言,广泛应用于操作系统、嵌入式系统、游戏开发等领域。
由于其语法简单、灵活,C语言成为许多初学者和进阶开发者首选的编程语言。
然而,在C语言编程过程中,由于各种原因,许多开发者容易犯错。
本文档旨在总结一些常见的C语言编程易错题,以帮助开发者避免类似的错误。
二、易错题及解决方法1. 变量命名错误变量命名是编程中非常重要的一步,正确的命名可以帮助读者更好地理解代码,并减少混淆和错误。
常见的变量命名错误包括:a. 命名不符合规范:使用非法字符、变量名过短或过长、不合适的缩写等。
b. 命名不一致:在不同代码片段中使用相同名称的变量,但在不同上下文中具有不同的含义。
c. 拼写错误:变量名中的字母、数字或符号拼写错误。
解决方法:使用有意义的变量名,遵循命名规范,确保拼写正确。
2. 数组越界在C语言中,数组的索引是从0开始的,因此越界可能导致未定义的行为。
常见的越界错误包括:a. 访问不存在的数组元素。
b. 使用局部变量的索引访问数组。
c. 在多维数组中发生越界。
解决方法:在使用数组时,确保索引在有效范围内,并进行必要的检查。
3. 类型不匹配类型不匹配可能导致程序崩溃或产生不正确的结果。
常见的类型不匹配错误包括:a. 将字符串存储在整数变量中。
b. 将浮点数与整数进行运算。
c. 传递不匹配的数据类型给函数。
解决方法:在编程时,确保数据类型的匹配,并了解各种数据类型的特性和限制。
4. 函数参数错误函数参数错误可能导致程序行为异常或产生错误结果。
常见的函数参数错误包括:a. 传递不正确的参数数量或类型给函数。
b. 在函数内部使用未初始化的参数。
c. 在函数内部修改了不应被修改的参数。
解决方法:在使用函数时,确保传递正确的参数数量和类型,并在函数内部正确使用参数。
5. 指针使用不当指针是C语言中非常重要的概念,正确使用指针可以大大提高编程效率。
常见的指针使用错误包括:a. 未初始化指针就进行操作。