1 C语言提供的合法的关键字是(D default)
2设有如下的定义 ( A *(*(pt+2)+3))
3以下不正确的叙述是(D当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值
4 下面C语言程序段的功能是 (D以写方式打开二进制文件test.dat)
5.有语句for(i=1;10;++i),其中表达式i=1将被执行 ( B1 ) 次
6 设有数组定义:char array[]=”China”;,则数组array所占的空间为( C6 ) 7 已知 int x=10,y=20,z=30;以下语句执行后x,y,z的值是( B B
x=20,y=30,z=30 )
8 C语言中基本的数据类型包括(C整型,实型,字符型和枚举型)
9,C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递是 (B值传递)
10 下面的for循环 (C执行4次)
11 定义char *aa="12345";,则执行语句printf("%c",*aa++);后,正确的输出结果是(A1)
12下列说法中正确的是(A在程序清单的任何地方都可以插入一个或多个空格符号)
13 函数printf("\abcd\b\102\103")的输出结果是(D bcbc)
14 已知:char a;int b;float c;double d则表达式2+a+9*b*5*c-5*d的结果是(A Double)。
15 变量的有效范围与其定义位置有关,(B在定义第一个函数之前所定义的变)其作用域在整个源程序文件中都有效。
16下列说法中错误的是(c变量的定义可以放在函数的任何位)
17 当c的值不为0时,下面选项中能正确将c的值赋给变量a、b的是(C (a=c)&&(b=c))
18 sizeof(float)是( B一个整型表达式)
19 外部变量对程序中的任一函数而言,它们是(B可直接存取的)
算法的表示方法有(A自然语言,传统流程图,N-S流程图,伪代码,计算机语言) 21一个C语言程序是由( B函数组成)
22 设有如下宏定义:(B42)
23 C语言中最简单的数据类型包括( B整型、实型、字符型)
24 在C语言中,逻辑值"真"用(D非0的数)表示
25 C语言程序的三种基本结构是(A顺序结构、选择结构、循环结构) 26 下面程序运行后,输出的结果是 (C字符c的地址)
27 x和y均为int型变量,则语句:x+=y;y=x-y;x-=y;的功能是(C交换x和y中的值) 28 如果定义变量a,b,c都为整型数据,则执行函
printf("%d",a=(b=4)+(c=6))的输出结果是 ( 10 )
29 以下叙述中正确的是( A构成C程序的基本单位是函数 )
30 结构化程序设计的三种基本结构是(B顺序,选择和循环)
31 一个C程序总是从(B主函数开始执行)
32 以下说法中正确的是(C C语言程序总是从main()函数开始执行)
33 在C语言中,如果下面的变量都是int类型,则输出的结果是 (A 7) 34 数组名作为参数传递给函数,作为该参数的数组名被处理为(D该数组的首地址)
35 下列标识中合法的用户标识符为(A year)
36 为表示关系x≥y≥z,应使用C语言表达式( A (x>=y)&&(y>=z))
37 下面能正确进行字符串赋值操作的是( C char *s;s="ABCDE")
39 其中 0≤i≤9, 则对a数组元素不正确的引用是( D a[10] )
40 设有如下的函数: ggg(x) float x; { printf("\n%d",x*x);}则函数的类型是( C int )
41 在C语言中,可以用作用户标识符的一组标识符是(B a3_b3、_123、IF) 42 以下叙述中不正确的是(D在一个函数内的复合语句中定义的变量在本函数范围内有效)
43 在C语言程序中,main()函数最多有( B 1 )
44 若x和y都是int型变量,且x=100,y=200,则执行printf("%d",x,y);语句后,输出的结果是(B100 )
45 下面程序段的输出结果是 (B 18)
46 一个C程序的执行是从(A本程序的main函数开始,到main函数结) 47 设ch是char类型变量,其值是K,则下面表达式的值是 ( D k )
ch=(ch>=’A’ && ch<=’Z’?(ch+32):ch)
48 在C语言中,合法的字符常量是(B'\084')
49 整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是(D x ^ y)
50 在Turbo C环境中,单步执行的键盘快捷键是( C F8 )
51 用链表表示线性表的优点是( C便于插入和删除操作)
52 在输入函数scanf()中,不能指定的格式是(D u)
53 下列语句中符合C语言语法的赋值语句是(D a=7;c=a*2)
54 下列算术运算符中,只能用于整型数据的是(C% )
55 设有说明int (*ptr)[m];,其中的标识符ptr是(c一个指向具有m个整型元素的一维数组的指针)
56 Turbo C语言环境中,无符号整型(unsigned int)数据类型的取值范围( C 0至65535)
57 正确的表达关系式a大于等于b平方或不等于c的C语言是(A a>=b**2)||(a<>c))
58 设a、b和c都是int型变量,且a=3,b=4,c=5,则下列表达式中,值为0的表达式是(D!(a='a'&&c))
59 下述对C语言字符数组的描述中,错误的是( C可以在赋值语句中通过赋值运算符"="对字符数组整体赋值)
60 下列C语言的运算符中三目运算符是(C? :)
61 设有定义:int n=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是( D *p=5 )
62 设i是int型变量,f是float型变量,用下面的语句给这两个变量输入值:i=100,f=765.12
63.如果定义x=0xffff,则函数printf(“%d”,.x*x)的输出结果是 (A1 ) 。 64 .FILE *p的作用是定义了一个文件型指针(或指向文件的指针),其中的FILE结构是在( D stdio.h )头文件中声明的
65.定义如下变量和数据 (C ceg) 。
66.已知x=43,ch='A',y=0;则表达式(x > = y&&ch < 'B'&&!y)的值是(A 1)
67 语句for(表达式1; ;表达式3)等价于( C for(表达式1;1;表达式3) )
68.以下不正确的定义语句是 (B int y[5]={0,1,3,5,7,9})
69 C语言用(C非0整数值 )表示逻辑“真”值。
70.设有如下变量定义:a=a-=(b=4)*(a=3)
71.下面函数调用语句中包含 ( B 2 ) 个实参。
72.C语言提供的合法的数据类型关键字是(B short)
73.算法的空]间复杂度是指( D 执行过程中所需要的存储空)
74.在下面对do-while语句的描述中,正确的是(D do-while语句构成的循环,当while语句中的表达式值为零时结束循环)
75.设有定义:int (*ptr)();,则下面叙述中正确的是(C ptr是指向函数的指
针,该函数返回一个int型数据) 76.下列叙述中错误的是(C空语句出现在任何位置都不影响程序运行)
77.若定义x和y为double类型,当x=1时,y=x+3/2的值是(A2.0 )
78.在C语言中能中止循环的语句是 (B break)
79 设正x、y均为整型变量,且x=10 y=3,则以下语句的输出结果是(D10,2 80 为了确保自定义函数调用后不返回任何值,则这种函数类型应定义的类型为
(C void ) 。
81 C语言程序的基本单位是()
82、 一个可执行的C程序的开始执行点是:( C main()函数 )
83 凡是函数中未指定存储类别的局部变量,其隐含的存储类别为 (A自动(auto))
84 有定义int ay[5];,对ay 数组元素错误的引用是(C ay[5])
85 当a的值为5,b的值为4时,逻辑表达式a<=6&&a+b>8的值为( A1 ) 86 结构化程序设计主要强调的是(D程序易读性)
87 若二维数组a有m列,则在a[i][j]之前的元素个数为(B i*m+j) 88 若有说明语句:char c='\72';则变量c(A包含1个字符)
90 则下面叙述中正确的是( D语句"*p=r;"取变量r的值放回r中)
91.若t为double类型,表达式t=1,t+5,t++的值是( C 1.0)
92.设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则下列不能正确执行的语句是(D p2=k;)
93. 以下只有在使用时才为该类型变量分配内存的存储类说明是( B auto和 register )
94. C语言允许函数类型缺省定义,此时函数值隐含的类型是( B int )
95. 从作用域的角度来分,C语言的变量可以分成( B局部变量和全局变量) 96 执行下面程序片段的结果是 (B打印出23)
97 C语言规定,在一个源程序中,main函数的位置(C可以任意)
98 函数printf("%d",1|2^3)输出结果是(C 1)
99 以下描述述中正确的是(D scanf("%f",&f))
101 C语言程序中有说明语句char *pt[4];则标识符pt的含义是 (B指向字符型变量的指针数组) 。
第二篇:c语言基础总结
常见错误
1.使用未初始化和未赋值的变量
描述:非全局变量和静态变量在定义时不自动进行初始化,初值为一个与该程序运行环境有
关的随机数。不赋值或没有显示初值就直接使用这样的变量是错误的。
解决:所有变量都显示地进行初始化,建议数值变量初始化为0,指针变量初始化为NULL
2.不考虑数值溢出的可能
描述:当赋值超过此范围数值,就会产生数值溢出,得到不正确的值。
解决:预先估算运行结果的可能范围,采用可能范围更大的,不处理负数,就用无符号类型。
运算还没开始前,判断运算数是否在合理取值的范围内,超出则停止运算。采用第三
方无取值范围的运算库。
3.不用sizeof()获得类型或变量的字长
描述:相同类型在不同平台上占得字节数不同。Int在16位,32位,64位系统分别占2,4,8
个字节。结构体所占字节也不是所有成员字长的简单相加,而是和平台与编译器,编
译项都有关系。
解决:用且只用sizeof获得字长
Int writeint (int fh ,int i)
{
Return write(fh ,&i,sizeof(i));
}
4.假定类型的取值范围
描述:类型的取值范围与程序编译息息相关。
解决:使用limits.h 和 float.h 定义的宏(INT--MAX, INT----MIN
ULONG--MAX FLT---MAX
5.期望两个整数的运算自动获得浮点数的结果
描述:两个数运算的结果还是整数,不是浮点数
方案:强制转换为浮点数,再运算
例:void func(void) void func(void)
{ {
Float f=0.0; float f=0.0;
Int a =3,b=2; int a=3, b=2;
f=a/b; f=a/(float)b;
printf (“%f,f); printf
}
6.不预先判除除数是否为0
编译器反应:直接写入inti=100/0,编译器会报错,编译器对此问题沉默
解决方案:先判断除数是否为0,若是0则不运算。
7.混淆“&,|”与“&&,||”
说明:他们是两种不同的运算符,有人总是弄错
8使用依赖编译器求值顺序的语句
描述:printf (“%d,%d,%d,i++,i++,i++); i=0可能输出 0.1.2 0.0.0. 2.1.0
方案:按期望的顺序分别求职,再综合运算
Void func(void)
{
Int a, b, c ,i=0;
a=i++;
b=i++
C=i++
Printf(“%d, %d, %d”,a,b,c)
9.使用依靠算符优先级的表达式
描述;没有记住优先级,容易出错。
解决:用括号明确优先计算的部分
10.表达式过于复杂
描述:(a>b||b>c)&&(o>P||q>p)?(a-b)*c+(o-p)*q:(a*b*c)-(o*p*q)
11.用“==”时误用“=”
12.用“==”比较两个浮点数
描述;两个数值表面相等或者非常接近的浮点时用“==”比较,结果可能不同
解决;不用float 用double 在精度运算中两个浮点数的差的绝对值只要小于一个
精度范围,就可以相等
13.使用幻数
描述:直接使用的常数
解决;把幻数定义为宏或枚举,建议使用枚举。编译提示会更清晰,准确
#define array-srze 10
Enum (array-size=10)
14 printf()和scanf()中格式控制字符串与参数类型不匹配
15.循环或判断语句以“;”结尾
描述:分别表示循环和判断语句的终结,后面的代码不算循环体或分支,而是循环和判断
平行的代码
解决:禁止在循环判断语句末尾出现分号,循环体为空的情况下,
While (.........)
{
}
16.在循环体内改变循环结束条件
例如:void func(void)
{\
Int a ,end:
-------
While (a<end)
{
在这里修改end的值
}
}
17.case分支不用break结束
规定每个case分支必须用break结束,两个分支用同样的代码,就把代码定义为函数
基本概念
函数是c的基本单位,必须有且仅有一个main函数。一个c可以包含一个到多个函数,在
函数中可以调用系统提供的库函数
函数首部:函数返回值类型,函数名,形参类型,形参名的说明
函数
函数体:大括号中的内容,包括变量声明(对象)语句和执行(动作)语句 c程序书写规则;以分号结束,并且书写注释;“/* */,注释之间不能留有空格 常见关键字:asm auto break case cdecl char
Const continue default do double else
Enum extern far float for goto
Huge if interrupt int long near
Pascal register return short signed
Sizeof static struct switch typedef
Union unsigned void volatile while
标识符:系统自定义标识符,用户自定义标识符
运算符:算数运算符:+ — * / % 关系运算符: > >= = < <= !=
逻辑运算符:! && ||
赋值运算符:=
复合的赋值运算符:+= -= *= /= %= &= != ^= <= >=
增一减一的运算符:++ - -
条件运算符:?:
强制类型转换运算符:
指针和地址运算符:* &
计算字节数运算符:sizeof
下标运算符:[]
结构体成员运算符:->
位运算符:<< >> | ^ & ~
逗号运算符:,
分隔符:相邻保留字,标识符之间由空格或回车换行做分隔符:相邻同类项之间用逗号分隔
声明相同类型的变量之间可用逗号分离,向屏幕输出的变量中各变量表达式之间用
逗号分离。
常见的转义字符:\n 换行 \r 回车 (不换行) \0 字符串结束 \t 水平制表
\v 垂直制表 \b退格 \f 走纸换页 \a响铃报警
\” 双引号 \’单引号 \\ 一个反斜线 \? 问号
常见错误
数组;数组的下标都是从0开始的,访问时发生下标多1或者少1都会越界访问内存错误
用变量来定义数组长度会导致语法错误,应该用整型常量或整型常量表达式定义
用a[x,y]而不是a[x][y]的形式来访问二维数组中的元素,将导致语法错误
( 数组的第1个元素的下标是0,数组元素1是指数组元素的下标为1,是数组的第
二个元素)
忘记对需要进行初始化的元素初始化,导致运行结果错误
对数组初始化的过程中,提供的初值个数多于数组所能容纳的元素个数 定义字符数组长度时,必须要多留一个字节的存储单元,存放结束标志\0 打印一个不包括字符串结束标志的\0,导致运行结果错误
直接使用赋值运算符对字符串赋值是错误的,必须用 strcpy()赋值
直接使用关系运算符比较字符串大小是错误的,必须使用strcpy()比较
字符串必须使用双引号括起来,单引号括起来是错误的。
一对双引号将一个字符常量括起来,产生一个指向包含两个字符的字符串指针 (把字符当做实参去调用形参是字符串的函数;把字符串当做实参去调用形参是字 符的函数,都会导致语法的错误!)
误以为在函数中定义的静态局部数组元素中的元素,在每次函数调用时都初始化0 ( 函数原型,函数定义的头部和函数调用语句三者,在形参和实参的数量,类型和 顺序,以及返回值的类型上没有严格保持一致,将导致语法错误。)
指针:误以为用来声明指针变量的星号(*)会对同一个声明语句中的所有指针变量都起作 用,而省略了其他指针变量名前的星号。实质是每一个每一个变量名前的星号都不能 省略。
没有对指针变量进行初始化,或没有将指针变量指向内存中某一个确定存储单元的情 况下,就利用这个指针变量去访问它所指向的存储单元,将导致严重的运行错误。 没有意识到某些函数形参是属于“传地址掉调用”而数值不是指针当做实参赋值给这 形参。
对没有指向数组中的某个元素的指针变量进行算数运算,是无意义的。
对并非指向同一数组中元素的两个指针进行相减或比较运算。是无意义的。 每个数组都有上,下边界,指针超出了边界就会造成越界访问内存错误。
除非两个指针类型都是void,否则将一种类型的指针赋值给其他类型的指针,造成语 法错误。
试图用一个void的指针变量去访问内存,是一个语法错误。
试图以指针运算的方式来改写一个数组名所代表的地址,是一个语法错误
内存分配不成功的话会导致非法内存访问错误,只要运行前检查指针是否为空指针, 可以避免错误发生。
如果内存分配成功,但是没有初始化,将会导致非法内存访问错误。
向系统申请了一块内存,结束后忘了释放内存,造成内存泄露。
释放了内存,但却仍然使用,会产生“野指针”
结构体,共用体:定义一个结构体时,忘记最后加上一个分号,导致语法错误
将一种类型的结构体赋值给另一种类型的结构体,导致语法错误
对两个结构体或者共用体进行比较,导致语法错误
在结构体指向运算符的两个组成符号“-” 和“>”之间插了空格,或者写成“→” 导致语法错误
只使用成员变量名访问结构体的一个成员,导致语法错误
直接使用结构体的每个成员类型所占内存字节数的“和”作为一个结构体实际所占的 字节数。是错误的。
没有标明结构体数组下标 就访问其中一个结构体数组元素,导致语法错误。
函数
递归函数是需要返回值的,在递归函数中忘记返回数值,是错误的
忘记了编写递归终止条件的分支语句,写错了递归步骤,都会导致递归函数不能收敛到 递归的终止条件,引起无穷递归
定义函数指针时,忘记将函数指针变量名及前面的星号用圆括号括起来,使得本应声明函 数指针变量的变量声明变成了一个函数声明语句。
将函数指针作为函数参数时,不在函数指针变量名后的一对圆括号中列出各函数参数的类 型,导致编译错误。
实施细则
1.函数
1.函数指针:通式:数据类型(*指针名)() int (*p)()
错误:忘记前一个()意义是声明一个函数,函数名为P,返回值是一 个指向整型变量的指针
忘记了后一个(),意义是定义了一个指向整型变量指针。 使用:1.定义过程 2.函数指针赋值过程 3.调用过程
2.递归:一个对象部分地由它和自己组成或它自己定义, 称它是递归的。
3.返回指针值的函数:通式:数据类型*函数名(参数名){}
区别; 不带*的函数值,函数值只能是一个数据,不能是一组 带*的函数值,不仅是一个数据,还能是一组数据。
2.结构体,共用体
位段:指定了存储位数的结构体或共用体的成员叫位段
优点:用最少的位数存储数据 注意:必须声明为int或unsigned型 使用:用struct作为关键字,定义了unsigned 的三个位段
“:”代表位段宽度的整数常量,访问位段成员的方法与访问结构体成 员的方法基本一致,用“圆点运算符”或“箭头运算符”
共用体:将不同的数据类型组合在一起,共占有同一段内存的用户自定义数据类型 注意:必须有足够大的内存空间将占据最大内存空间的成员存储在内,内 存空间的大小由占据内存空间成员所占的空间数决定。
动态数据结构:在结构体类型中,如果包含了本结构体类型的成员,由于本结构所 占的内存字节数无法确定,系统无法正常分配内存。
声明结构体类型是不能包含自我,但可以包含指向本结构体类型的指针域。 操作:
Struct temp
{
Int data;
Struct temp *temp;
};
利用函数malloc()申请一个结构体的内存
Struct temp
{
Int data;
Char name[10];
};
Struct temp *p;
P=(struct temp*)malloc(10*sizeof(struct temp)); 利用函数calloc()申请一个结构体内存
Struct temp *p
P=(strut temp*)calloc(10*sizeof(struct 利用函数free()释放申请的内存空间,
链表的定义
temp));