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语言易错题目及其解析答:死循环是指程序进入一个无限循环的状态,无法正常结束。
造成死循环的情况可能包括以下几种:- 循环条件永远为真,如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编程时常犯的错误,写给各位学员以供参考.******************************** ******************************** ************************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语言笔试频繁易错题
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#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语言易错题集(选择、填空)
以下各个项中,可作为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。
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语言易错题总结
1. **变量未初始化**:在使用变量之前,一定要先进行初始化,否则其值是随机的,可能会导致程序出现错误的结果。
2. **数组越界**:C语言中数组的下标是从0开始的,因此,一个长度为n的数组的有效下标范围是[0, n-1]。
如果试图访问超出这个范围的下标,就会导致数组越界错误。
3. **类型转换错误**:在C语言中,需要进行显式类型转换。
如果不进行显式转换,可能会导致数据丢失或者结果不符合预期。
4. **逻辑错误**:这类错误比较隐蔽,通常是由于代码中的逻辑错误导致的。
例如,条件判断错误、循环控制错误等。
5. **指针错误**:指针是C语言中的一大难点,也是常见的错误来源。
常见的指针错误包括指针未初始化、野指针、指针越界等。
6. **内存泄漏**:在C语言中,需要手动管理内存。
如果在使用完内存后没有及时释放,就会导致内存泄漏。
7. **函数返回值未检查**:在调用函数时,一定要检查函数的返回值,以确定函数是否执行成功。
如果忽略了返回值检查,可能会导致程序出现错误。
8. **文件操作错误**:在进行文件操作时,如果文件不存在或者无法打开,就会导致文件操作错误。
在进行文件操作时,一定要先检查文件是否存在并且可读。
9. **语法错误**:这类错误是最常见的,通常是由于拼写错误、缺少分号、括号不匹配等原因导致的。
以上就是C语言中常见的一些易错题类型,为了避免这些错误,需要仔细检查代码,并养成良好的编程习惯。
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语言编程过程中,由于各种原因,许多开发者容易犯错。
本文档旨在总结一些常见的C语言编程易错题,以帮助开发者避免类似的错误。
二、易错题及解决方法1. 变量命名错误变量命名是编程中非常重要的一步,正确的命名可以帮助读者更好地理解代码,并减少混淆和错误。
常见的变量命名错误包括:a. 命名不符合规范:使用非法字符、变量名过短或过长、不合适的缩写等。
b. 命名不一致:在不同代码片段中使用相同名称的变量,但在不同上下文中具有不同的含义。
c. 拼写错误:变量名中的字母、数字或符号拼写错误。
解决方法:使用有意义的变量名,遵循命名规范,确保拼写正确。
2. 数组越界在C语言中,数组的索引是从0开始的,因此越界可能导致未定义的行为。
常见的越界错误包括:a. 访问不存在的数组元素。
b. 使用局部变量的索引访问数组。
c. 在多维数组中发生越界。
解决方法:在使用数组时,确保索引在有效范围内,并进行必要的检查。
3. 类型不匹配类型不匹配可能导致程序崩溃或产生不正确的结果。
常见的类型不匹配错误包括:a. 将字符串存储在整数变量中。
b. 将浮点数与整数进行运算。
c. 传递不匹配的数据类型给函数。
解决方法:在编程时,确保数据类型的匹配,并了解各种数据类型的特性和限制。
4. 函数参数错误函数参数错误可能导致程序行为异常或产生错误结果。
常见的函数参数错误包括:a. 传递不正确的参数数量或类型给函数。
b. 在函数内部使用未初始化的参数。
c. 在函数内部修改了不应被修改的参数。
解决方法:在使用函数时,确保传递正确的参数数量和类型,并在函数内部正确使用参数。
5. 指针使用不当指针是C语言中非常重要的概念,正确使用指针可以大大提高编程效率。
常见的指针使用错误包括:a. 未初始化指针就进行操作。
C语言专升本易错题
c语言中浮点数的默认类型是double,因为double的精度高,22. 表达式18/4*sqrt(4.0)/8值的数据类型为:A) int B)float C)double D)不确定31. 已有如下定义和输入语句 ,若要求a1,a2,c1,c2值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是int a1,a2; char c1,c2;scanf("%d%c%d%c",&a1,&c1,&a2,&c2);A)10A 20B< CR> (空格有没有都行,10和A之间不能有空格,否则c1为空格)B)10 A 20 B<CR>C)10A20<CR>D)10A20 B<cR>。
32. 已有定义int x; f1oat y;且执行scanf("%3d%f",&x,&y);语句,若从第一列开始输入数据12345 678(回车),则x 的值为A)12345 B)123 C) 45 D) 34533. 已有定义int x; f1oat y;且执行scanf("%3d%f",&x,&y);语句,若从第一列开始输入数据12345 678(回车),则y 的值为:A)无定值B)45.0000 C) 678.000000 D) 123.00000*p[5]表示2维数组P[5][](*p)[5]表示P指向包含5个元素的一维数组,整体也是个二维数组sizeof 是整个变量的大小strlen 是字符串的大小sizeof 计算的是数据在内存中存放的长度strlen 计算的是字符串的长度,单位是“字符”,只能对字符串运算,而且它是函数(不是运算符)b=c;c=a(顺序)与b=c=a(倒序)不同设A为存放(短)整型的一维数组,如果A的首地址为P,那么A中第i 个元素的地址为()。
C语言二级考试易错题及答案
一:选择题3-2.int x=2,y=3;,表达式x=(y==3)的值是()。
A) 0 B) 1 C) 2 D) 34-1.下列语句中,不符合C语言语法的赋值语句是()。
A) a=7+b+c=a+7; B) a=7+b++=a+7; C) a=7+b,b++,a+7; D) a=7=b,c=a+7;注:a=7+b,b++,a+7;实为逗号语句,非赋值语句5-3.float x; 要从键盘输入36.282给x,应选()语句。
A)scanf("%5.3f",&x); B)scanf("%2.3f",&x);C)scanf("%6.3f",&x); D)scanf("%6f",&x);注:scanf后面没有(.nf的表达方式)9-2.int a; 下列语句中,非死循环的是()。
A) while(-1) { a++; } B) for(;(a=getchar())!='\n';);C) for(;;a+=2); D) for(a=10;;a--);注:省略了表达式二,在不做其它处理的时候将成为死循环,一个空表达式的值一般为非零。
P99.10-1.设已定义char s[]="\"Name\\Address\023\n";,则字符串所占的字节数是()。
A) 19 B) 16 C) 18 D) 14注:'\023’,即ASCII码值为八进制23的字符;'\n’即回车符。
strlen(s)为15(不算'\0');算上'\0',所占的字节数是1611-1.以下程序段的运行结果是()。
main(){ int i=4,j;j=i;pic(i+2*j-2,'*');putchar('\n');for(j- =2; j>=0; j--){ pic(3-j, ' ');pic(i+2*j,'*');putchar('\n');}}pic(int len,char c){ int k;for(k=1;k<=len;k++) putchar(c);}D) ****************************C) ******************B) ****************************************A) ****************注:11-2. 以下程序运行结果是()。
C语言易错题分析解答
一、单项选择题(每小题2 分,共50 分)1、一个C 程序的执行是从___A__。
A、本程序的 main 函数开始,到 main 函数结束B、本程序的 main 函数开始,到本程序文件的最后一个函数结束C、本程序文件的第一个函数开始,到本程序文件的最后一个函数结束D、本程序文件的第一个函数开始,到本程序 main 函数结束2、C 语言程序的基本单位是___C___。
A、程序行B、语句C、函数D、字符3、请选出可用作 C 语言用户标识符的一组标识符___B___。
A、voidB、a3_b3C、ForD、2a define _123 -abc DO WORD IF asesizeof注:C语言用户标识符命名规则为:1.只能由字母、数值和下划线3种字符组成。
2.第一个字符必须是字母或下划线。
3.不能与C语言中的关键字或保留字相同。
B)中的IF 不合法,a3_b3 和 _123 都可以用作C语言用户标识符C) For和Case都是C语言中的关键字,而-abc有不合法的字符“-”4、假定 x 和 y 为 double 型,则表达式(x=2,y=x+5/2)的值是__C__ 。
A、4.500000B、4C、4.000000D、2.0000005、下列可以正确表示字符型常量的是___D__。
A、297B、"a"C、"\u005cn"D、'\t'注;字符型常量的十进制ASCII值0~255, 所以A错B,C加了双引号,都表示字符串常量D,是单引号,正确6、在 C 语言中,要求运算数必须是整型的运算符是__D__。
A、/B、++C、*=D、%注:. % -- 整除取余数运算,二个运算数必须是整型。
b. ++ -- 自增,非整型也允许自增。
7、C 语言中,复合语句的构成是将一系列语句置于__C__。
A、begin 与 end 之间B、方框号“[ ]”之间C、花括号“{ }”之间D、圆括号“( )”之间8、有如下程序段,对应正确的数据输入是___D___。
c语言 经典易错题
1. **问题:**```c#include <stdio.h>int main() {int x = 5;printf("%d", x++);return 0;}```**解析:**输出为5,因为后置递增操作符`x++`会先返回`x`的值,然后再将`x`的值加1。
2. **问题:**```c#include <stdio.h>int main() {int x = 5;printf("%d", ++x);return 0;}```**解析:**输出为6,因为前置递增操作符`++x`会先将`x`的值加1,然后返回加1后的值。
3. **问题:**```c#include <stdio.h>int main() {int x = 5;printf("%d", x++);printf("%d", x);return 0;}```**解析:**输出为56,因为第一个`printf`语句中的`x++`会先返回`x`的值(5),然后再将`x`的值加1,所以第一个`printf`输出5,第二个`printf`输出加1后的值6。
4. **问题:**```c#include <stdio.h>int main() {char ch;while (ch = getchar() != '\n') {putchar(ch);}return 0;}```**解析:**此循环将一直运行,即使输入了回车键。
原因是赋值操作符`=`的优先级低于不等于操作符`!=`,所以`getchar() != '\n'`会先执行,然后将结果赋给`ch`。
应该使用括号来明确优先级:`while ((ch = getchar()) != '\n')`。
5. **问题:**```c#include <stdio.h>int main() {char str[] = "Hello";printf("%c", str[5]);return 0;}```**解析:**会输出未定义的结果,因为数组`str`的有效索引是0到4,访问`str[5]`超出了数组的边界。
c语言易错题目及其解析
c语言易错题目及其解析1.在C语言中,++i 与 i++ 的区别是什么?答:++i是先进行自增操作,再进行表达式运算;i++是先进行表达式运算,再进行自增操作。
2. 下面这段代码会输出什么?int i = 10;while (i-->0){printf('%d ',i);}答:输出9 8 7 6 5 4 3 2 1 0。
该代码利用了C语言中的后缀递减运算符--。
3. 在C语言中,如何实现字符串反转?答:可以通过循环遍历字符串,将字符串的首尾字符进行交换,直到遍历到字符串的中间位置。
4. 下面这段代码会输出什么?char *str = 'hello';printf('%d',sizeof(str));答:输出指针变量str所占的内存字节数,通常是4或8(根据编译器的位数而定),因为指针变量本身只是一个指向地址的变量。
5. 在C语言中,如何实现动态内存分配?答:可以使用标准库函数malloc()来分配内存,并使用函数free()来释放内存。
6. 下面这段代码会输出什么?int a[5] = {1,2,3,4,5};int *p = (int*)(&a+1);printf('%d,%d',*(a+1),*(p-1));答:输出2,5。
该代码利用了指针的运算规则,因为&a是指向整个数组a的指针,所以&a+1会指向a数组之后的一个未知内存地址,然后将其强制转换为int*类型的指针p,由于a数组是连续存储的,所以p-1指向的是a[4]的地址,*(p-1)就是a[4]的值。
而*(a+1)就是a[1]的值。
C语言易错题集及易忘知识
C语言易错题集及易忘知识1.下面的程序运行后输出为【】。
main( ){ int a=-32769;ptintf("%8U\\n",a);}A) 32769 B) %8U C) 32767 D) -32767分析:格式字符必须小写,题中的"%8U"不会当作格式控制符,而是原样输出,变量a 将没有对应的格式说明,也不会送出。
本题正确答案为B。
2. ①八进制----> 十进制(31.5)(八)整数部分:3*8(1)+1*8(0)=25小数部分:5*8(-1)=0.625所以(31.5)(八)=(25.625)(十)②十六进制----> 十进制(19.A)(十六)整数部分:1*16(1)+9*16(0)=25小数部分:10*16(-1)=0.625所以(19.A)(十六)=(25.625)(十)3. 若执行下面程序段后的输出为:3,4,5,请填空。
int a,b=3,c=5;a=b<c?【3】:c++;printf("%d,%d,%d",a,b,c);分析:本题考查条件运算符和增量运算符的概念,题中b<C为真,应取B++的值给A,因B的值是先用后增1,所以A为3,题中的C++没有执行到,C保持原值。
4. 与其它高级语言相比,在C语言中赋值号并不是优先级最低的,C语言中优先级最低的运算符是逗号运算符。
5. C语言语句一行写不下时,可以【D 】。
A) 用逗号换行B) 用分号换行C) 用回车换行D) 在任意一空格处换行6. 表达式5%(-3)的值是2 ,表达式-5%(-3)的值是-2 。
分析:注意到%运算符只能两边为整数,且其作用是取余数,与正负无关,二%的优先级高于符号。
7. 在C语言中,格式输入库函数为scanf 格式输出库函数为printf 。
8. C语言中构造类型的数据有三种:数组、结构体和共用体,数组是同类型数据的集合,结构体是不同类型的数据集合。
c语言结构体易错题
c语言结构体易错题以下是一些C语言结构体易错题:1.结构体变量作为函数参数时是值传递还是地址传递?答:结构体变量作为函数参数时,默认情况下是值传递,即会复制一个新的结构体变量传递给函数。
如果想要通过地址传递结构体变量,需要使用指针。
2.结构体变量可以在定义时初始化吗?答:是的,结构体变量可以在定义时进行初始化。
例如:cstruct Student {char name[20];int age;};int main() {struct Student stu = {"Tom", 18};return0;}注意,如果结构体中包含指针类型的成员,则只能初始化指针本身,而不能初始化指针所指向的内容。
3.结构体数组中的每个元素都是结构体类型的数据吗?答:是的,结构体数组中的每个元素都是结构体类型的数据。
每个元素都包含结构体中定义的所有成员。
4.结构体类型变量的长度等于各成员长度之和吗?答:不一定。
结构体类型变量的长度可能会因为编译器对内存对齐的要求而大于各成员长度之和。
编译器为了提高内存的访问效率,可能会对结构体成员进行内存对齐,使得每个成员的起始地址都是某个数的倍数。
这样会导致结构体类型变量的长度大于各成员长度之和。
5.共用体类型和结构体类型有什么区别?答:共用体类型和结构体类型都可以包含多个成员,但是它们的使用方式不同。
结构体类型中的成员各自占用不同的内存空间,而共用体类型中的成员则共享同一块内存空间,即所有成员的首地址相同。
因此,共用体类型变量的长度等于最长的成员的长度。
需要注意的是,由于共用体类型中的成员共享内存空间,因此修改其中一个成员的值会影响其他成员的值。
在使用共用体类型时需要特别小心。
c语言知识题库(50道判断题)
1. C语言是编译型语言。
(对)2. 在C语言中,数组的索引是从1开始的。
(错)3. 在C语言中,所有变量必须在使用前先声明。
(对)4. C语言支持函数重载。
(错)5. C语言中,`/*...*/`用于单行注释。
(错)6. C语言中,字符常量用单引号括起来。
(对)7. C语言中,字符串常量用双引号括起来。
(对)8. 在C语言中,`int`类型变量的大小在所有平台上都是一样的。
(错)9. C语言中,`sizeof`运算符用于求变量或数据类型的大小。
(对)10. 在C语言中,`main`函数可以没有返回值。
(错)11. C语言中的`printf`函数用于输出信息到屏幕。
(对)12. C语言中的`scanf`函数用于从键盘输入信息。
(对)13. C语言中,指针变量存储的是变量的地址。
(对)14. C语言中,`*`运算符用于获取指针变量所指向的值。
(对)15. C语言中,数组名本身就是指针。
(对)16. C语言中,`&`运算符用于获取变量的地址。
(对)17. C语言中,字符串结尾是以'\0'标识的。
(对)18. C语言中,`malloc`函数用于动态内存分配。
(对)19. 在C语言中,不能对空指针进行解引用操作。
(对)20. C语言中,`free`函数用于释放动态分配的内存。
(对)21. C语言中的`enum`类型用于定义枚举。
(对)22. C语言中的`struct`用于定义结构体。
(对)23. C语言中的`union`和`struct`是相同的。
(错)24. C语言中,`void`表示无返回值的函数。
(对)25. C语言中,`const`关键字用于定义常量。
(对)26. C语言中,`#define`用于定义宏。
(对)27. C语言中,`#include`用于包含头文件。
(对)28. C语言中,`break`用于跳出当前循环。
(对)29. C语言中,`continue`用于跳过本次循环的剩余部分,直接开始下一次循环。
C语言错题汇总
练习11、在下数据输出的判断中,正确的是()。
int x=0xaffbc;printf(“%x”,x);A.赋值非法B.输出值不确定C.输出值为affbD.输出值为ffbc2、下列语句中,最正确的赋值语句是()。
A.a=7+b+c=a+7;B.a=7+b++=a+7;C.a=7+b,b++,a+7;D.a=(7+b,c=a+7);3、下列语句中正确的是()。
A.int x=y=z=0;B.int z=(x+y)++;C.x+=3= =2;D.x%=2.5;4、表达式a=(a=6,a*3,a+3);运行后。
则a的值为()。
A. 39B. 36C. 6D. 95、C语言的程序一行写不下时,可以()。
A. 用逗号换行B.用分号换行C.在任意一空格处换行D.用回车符换行6、对于条件表达式(M)?(a++):(a--)来说,其中的表达式M等价于()。
A. M==0B. M==1C. M!=0D.M!=17、下列程序的输出结果是()。
main(){int x=0,y=5,z=3;while(z-->0&&++x<5)y=y-1;printf(“%d,%d,%d\n”,x,y,z);}A.3,2,0B.3,2,-1C.4,3,-1D.5,-2,5练习21、若x和y均为int型变量,则执行下面的循环后,y的值为()。
for(y=1,x=1;y<=5;y++){if(x>=10)break;if(x%2==1){x+=5;continue;}x-=3;}A.2B.4C.6 D82、在下列程序中,若要求a1,a2,c1,c2的值分别为10,20,A,B,正确的数据输入是()。
main(){int a1,a2;char c1,c2;scanf(“%d%d”,&a1,&a2);scanf(“%c%c”,&c1,&c2);}A.1020AB<CR>B.10 20<CR>AB<CR>C.10 20 AB<CR>D.10 20AB<CR>3、下列程序段中所表示的逻辑关系是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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. 1 12
D.程序错误,值为任意值
14. 下列程序的结果是: #include <stdio.h> #define PR(a) printf("%d\t",(int)(a)); #define PRINT(a) PR(a);printf("ok!") main() {int i,a=1; for(i=0;i<3;i++) PRINT(a+i); printf("\n");
} D.fund(int *x,int *y) {*x=*y;*y=*x; } 21.设有如下定义 struct sk {int n; float x; }data,*p; 若要使 p 指向 data 中 n 域,真确的赋值语句是: A.p=&data.n; B.*p=data.n; C.p=(struct sk *) &data.n; D.p=( struct sk *) data.n; 22.以下程序的输出结果是 256 。 union {char m[2]; int k;} mk; main() {mk.m[0]=0; mk.m[1]=1; printf("%d\n",mk.k); } 解:char 占一个字节,int 占两个字节,共用体变量 mk 的两个成员共占用存储单元,给数 组赋值后,存储状况如下下可以讲 char 型变量 s 中的大小写字母进行转化(即大写改小写,小写改大写)的语 句是: A.s=s^32 B.s=s&32 C.s=s|32 D.s=s+32 16.以下程序的输出结果是: main() {char a=0xf0,b=03,c; c=~a&020>>b; printf("%x\n",c); } 结果:2 (注意运算符优先级高低) 17.若有以下定义和语句: int *p,i=1; double *w,a=3.5; p=&i; w=&a; 在执行了 p=(int *)w;语句后,*p 的值为: A.4 B.3.5 C.3 D.一个整数 注意:double 类型的数据与 int 类型数据存放的机制不同, 因此无法估计此证书的确切值 18.已知函数说明语句:void *f() ;则它的含义是: A.函数 f 的返回值是一个通用型指针 B.函数 f 的返回值可以是任意的数据类型 C.函数 f 无返回值 D.指针 f 指向一个函数,该函数无返回值 19.已知 int a[]={1,2,3,4},y,*p=&a[1]; y=(*--p)++;则 y 的值是 A.1 B.2 C.3 D.4 20.函数的功能是交换变量 x 和 y 的值,且通过正确调用返回交换结果,能正确执行此功能 的函数是: A.funa(int *x,int*y) {int *p; *p=x;*x=*y;*y=*p; } B.funb(int x,int y) {int t; t=x;x=y;y=t; } C.func(int *x,int *y) {*x=*x+*y;*y=*x-*y;*x=*x-*y;
D.24
25.以下程序段中,能过通过调用函数 fun,使 main 函数中的指针变量 p 指向一个合法的整 型单元是: A.int fun(int *p) B.int fun(int **p) {int s; p=&s;} {int s; *p=&s;}
main() {int *p; fun(p); } C.#include <stdlib.h> int fun(int **p) {*p=(int *)malloc(2);} main() {int *p; fun(&p); 答案: C
23.下列叙述中正确的是: A. C 语言中既有逻辑类型也有集合类型 B. C 语言中没有逻辑类型但有集合类型 C. C 语言中有逻辑类型但没有集合类型 D. C 语言中既没有逻辑类型也没有集合类型 24.以下程序的输出结果是: main() {int p[7]={11,13,14,15,16,17,18},i=0,k=0; while(i<7&&p[i]%2) k=k+p[i++]; printf("%d\n",k); } A.58 B.56 C.45
void fun(char *a,char *b) {a=b; (*a)++;} main() {char c1='A',c2='a',*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf("%c%c\n",c1,c2); } A.Ab B.aa
C.Aa
D.Bb
32.若程序中包含头文件 stdio.h ,以下选项中,正确运用指针变量的程序段是 A.int *i=NULL; B.float *f=NULL; scanf("%d",i); *f=10.5; C.char t='m', *c=&t; D.long *L; *c=&t; L='\0'; 33.有以下程序执行的结果是: char fun(char x,char y) {if (x<y) return x; return y; } main() {char a='9',b='8',c='7'; printf("%c\n",fun(fun(a,b),fun(b,c))); } A.函数调用出错 B.8 C.9 34.有以下程序执行后输出结果是 #include <stdio.h> int a=2; int f(int *a) {return (*a)++;} main() {int s=0; {int a=5; s+=f(&a); } s+=f(&a); printf("%d\n",s); } A.10 B.9 35.有以下程序执行后输出结果是 #define f(x) x*x main() {int i;
易错题整理 1. void main() { float y=3.667; printf("*%8.0f*\n",y); } 结果:* 4* 2.void main() { int x=1,y=2; printf("%d,",x>y?y++:x++); printf("%d,",x<=y?++y:++x); printf("%d,%d",x,y); } 结果:1, 3, 2,3 3.void main() { int x=0,y=0,z=0; do { switch(y++) { case 1:x++;break; case 3:x+=3;break; default:x=x%2;continue; } z++; } while(y<5); printf("x=%d,y=%d,z=%d\n",x,y,z); } 结果:x=0, y=5, z=2 4. 若有定义和语句:double x=34213.6894; printf("*%8.2e*\n", x); 则下列说法真确的 是: A. 输出值为*3.42e+04* B. 输出值为*3.42e+004* C. 输出值为*34.21e+04* D. 输出格式符宽域不够,不能输出值 答案:B 5. void main() {int a=2,b=5; printf("a=%%d,b=%%d\n"); }