C)!
m&&!
nD)!
m||!
n
参考答案:
A
示例16:
表达式“(E)?
(x+1):
(y+1)”中的条件表达式(E)等价的是 。
参考答案:
E!
=0或E<0||E>0
知识点9:
break语句可用于switch语句和循环体中,continue只能用于循环体中,用于结束本次循环。
示例17:
continue只能用于 中。
参考答案:
循环体
示例18:
下列叙述正确的是 。
A)break语句只能用于switch语句
B)continue语句只能用于switch语句
C)break语句必须与switch语句中的case配对
D)break可用于switch语句和循环体中
参考答案:
D
知识点10:
在定义数组时可为其赋初始,并且第一维元素个数可以不写。
示例19:
下面正确定义一维数组的选项是 。
A)inta[2]={1,2,3};B)chara[]={1,2,3,4,5};
C)chara={'a','b','c'};D)inta[3]="abc";
参考答案:
B
示例20:
下面正确定义二维数组的选项是 。
A)inta[2][3]={1,2,3};B)chara[][2]={1,2,3,4,5};
C)chara[2][2]={'a','b','c','d','e'};D)inta[2][4]={"abc","123"};
参考答案:
B
示例21:
以下二维数组定义中错误的是 。
A)intx[][3]={0,1,2,3,4,5,6,7,8};B)intx[2][3]={{0,1},{2,3},{4,5}};
C)intx[][3]={{1},{2}};D)intx[2][2]={1,2,3,4};
参考答案:
B
知识点11:
函数返回值类型取决于定义函数时的函数首部所说明的函数类型。
示例22:
函数返回值类型取决于定义函数时的函数首部所说明的 。
参考答案:
函数类型
示例23:
在C语言中,函数返回值的类型与 相同。
A)函数原型中的函数类型B)return语句中表达式的类型
C)函数的实参类型D)函数的形参类型
参考答案:
A
示例24:
已定义以下函数“intfun(int*p){return*p;}”,则fun函数返回值是 。
参考答案:
一个整型数
知识点12:
在调用函数时,不写函数的返回值类型与实参类型。
示例25:
有以下函数定义“voidf(inta){…}”,如果以下选项中的变量都已经正确定义并赋值,则对函数f的正确调用语句是 。
A)f(inta);B)f(1.0);C)f("123");D)voidf(a);
参考答案:
B
知识点13:
如果指针变量p指向x,则可用*p间接访问x。
示例26:
若有定义:
“intx=18,*p=&x;”,则*p的值是 。
参考答案:
18
知识点14:
指针变量不能被赋值为整型值。
只能被赋值为地址值。
示例27:
设已有定义:
“floatx;”,则以下对指针变量p进行定义且赋初值的语句中正确的是 。
A)float*p=1024;B)int*p=(int)x+1;
C)floatp=&x;D)float*p=&x;
参考答案:
D
知识点15:
调用scanf函数时,应写输入项的地址值。
示例28:
若有定义:
“intx=18,*p=&x;”,则通过p输入x的语句是“scanf("%f", );”。
参考答案:
p
如有定义“inta[10],*p=a;”,则p指向a[0],p+i指向a[i],*(p+i)=*(a+i)=a[i]=p[i]。
示例29:
若有定义“inta[10],*p=a;”,当执行“p++;”后,p指向 。
参考答案:
a[1]
知识点16:
结构体变量所占内存长度是各成员占的内存长度之和。
共用体变量所占的内存长度等于最长的成员的长度。
共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
示例30:
若有以下定义:
union
{
inta;
charb;
doublec;
}data;
以下叙述中错误的是 。
A)data的每个成员起始地址都相同
B)变量data所占的内存字节数与成员c所占字节数相等
C)程序段“data.a=16;printf("%fln",data.c);”输出结果为16.000000
D)data可作为函数的实参
参考答案:
C
示例31:
若有以下定义:
union
{
shortinta;
charb;
doublec;
}data;
变量data所占的内存字节数为 。
参考答案:
8
示例32:
若有以下定义:
struct
{
shortinta;
charb;
doublec;
}data;
变量data所占的内存字节数为 。
参考答案:
11
知识点17:
用typedef声明新的类型名来代替已有的类型名。
一般使用格式为“typedwf已有类型新类型;”。
示例33:
设有以下语句:
typedefstructDateType
{
intmonth;
intday;
intyear;
}DATE;
则下面叙述中正确的是 。
A)不能用structDateType定义结构体变量
B)DATE是struct类型的变量
C)可以用DATE定义结构体变量
D)DATE是structDateType类型的变量
参考答案:
C
示例34:
声明STRING为字符指针类型的语句为 。
参考答案:
typedefchar*STRING;
知识点18:
宏定义和文件包含都属于预处理命令,在源程序的一行上只能写一条预处理命令,对源程序编译之前做一些处理,生成扩展C源程序,都不占用程序运行时间。
示例35:
宏替换命令 程序的运行时间。
参考答案:
不占用
示例36:
以下叙述中正确的是 。
A)在源文件的一行上只能有一条预处理命令
B)宏名必须用小写字母表示
C)宏替换要占用程序的运行时间
D)前面都是错语的
参考答案:
A
示例37:
若程序有宏定义"#defineN168;",则以下叙述中正确的是 。
A)在预编译时,对C源程序用168替换标识符N
B)在编译时,用168替换标识符N
C)在运行时,用168替换标识符N
D)前面都是错误的
参考答案:
A
知识点19:
数据块读写函数(fread()和fwrite())的调用函数调用“fread(buffer,size,count,fp);”与“fwrite(buffer,size,count,fp);”中的buffer是指针,对fread来说,它是读入数据的存放地址,对fwrite来说,是要输出数据的地址(均指起始地址)。
示例38:
读取二进制文件的函数调用形式为“fwrite(buffer,size,count,pt);”,其中buffer是 。
A)一个文件指针B)一个内存块的首地址,表示读入数据存放的地址
C)一个内存块的字节数D)一个内存块的首地址,表示输出数据存放的地址
参考答案:
D
知识点20:
如到文件末尾,则函数feof的函数值为真
(1),否则函数值为假(0)。
示例38:
设fp为指向一二进制文件的指针,且还未读到此文件末尾,则函数feof(fp)的返回值为 。
A)EOFB)1C)0D)NULL
参考答案:
C
示例39:
设fp为指向一二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为 。
参考答案:
1
知识点21:
指针变量的值是地址,不能赋一个整数作为指针变量。
示例40:
以下叙述中错误的是 。
A)通过函数形参的值可以改变对应实参的值B)函数可以返回地址值
C)可以将一个整数赋给一个指针变量D)函数的形参可以为结构体类型
参考答案:
C
知识点22:
对于逻辑表达式,并不是所有的逻辑运算符都要被执行。
例如a&&b,只有a为真时,才需要判断b的值,又如a||b,只要a为真,就不必判断b的值。
示例41:
已有定义“floatx=6;intn=8,k;”,执行“k=x||n++”以后,n的值为 。
参考答案:
8
示例42:
已有定义“intm=6,n=8,k;”,执行“k=!
m&&--n”以后,n的值为 。
参考答案:
8
示例43:
有以下程序:
#include
intmain(void)
{
inta,b,c;
a=2;b=3;
c=(a/b<1)||(a%b>1);
printf("%d%d%d\n",a,b,c);
return0;
}
运行结果是:
参考答案:
231
点评:
由于“a/b<1”为值,所以“(a/b<1)||(a%b>1)”也为真(值为1),所以c=1。
知识点23:
对数值型或字符型数组在定义时可进行初始化,如所给初值的小于数组元素个数,则未赋初值的元素的值为0(或'\0')。
示例44:
设有定义语句:
“inta[][168]={{1},{2}};”,则数组元素a[1][16]的值为 。
参考答案:
0
示例45:
设有定义语句:
“inta[16]={1,2};”,则数组元素a[6]的值为 。
参考答案:
0
知识点24:
对于“intn,*p=&n;”,则*p为p所指向变量n的值,&n为n的地址。
示例46:
对于“intn=8,*p=&n;”,则*p的值为 。
参考答案:
8
示例47:
已有定义“inta=1024;”,a的地址为1026,则&a= 。
参考答案:
1026
知识点25:
打开文件语句“fopen(文件名,使用文件方式);”,使用文件方式为字符串,对于打开文本文件,“r”表示(只读)为输入打开一个文本文件,“w”表示(只写)为输出打开一个文本文件,“a”表示(追加)向文本文件尾增加数据。
示例48:
设有定义:
“FILE*fp;”,将以下打开文件的语句补充完整,以便为输出打开一个文本文件。
fp=fopen("test.txt", );
参考答案:
"w"
示例49:
以下程序建立一个名为test.txt的字符文件(文本文件),将从键盘输入的一行字符存入文件中。
请填空。
#include
#include
intmain(void)
{
FILE*fp;
charch;
if((fp=fopen("test.txt",[1]))==NULL)
{
printf("Cannotopen!
\n");
exit(0);
}
printf("Enterdata\n");
while((ch=getchar())!
='\n')fputc(ch,fp);
fclose(fp);
return0;
}
参考答案:
[1]"w"
点评:
文件操作方式是字符串,注意"w"应用双引号括起来。
知识点26:
malloc的函数原型为“void*malloc(unsignedintsize);”,一般使用格式为“(基类型*)malloc(sizeof(基类型))”。
示例50:
已有指针定义“float*p;”,请写出完整的语句,利用malloc函数使p指向一个动态存储单元 。
参考答案:
p=(float*)malloc(sizeof(float))
知识点27:
通过关键定extern声明将外部变量的作用域在本文件范围内扩充也可将用作域扩充到其他程序文件中。
示例51:
用关键字extern声明的变量为。
参考答案:
外部变量
知识点28:
通过关键定static声明将外部变量的作用域在仅限于所在文件中。
示例52:
在多文件程序中,要将外部变量的作用域仅限于所在文件,应使用关键字 。
参考答案:
static
知识点29:
枚举类型用于将变量的值一一列举出来,变量的值只限于列举出来的值的范围内,声明枚举类型用enum。
示例53:
声明枚举类型使用的关键字是 。
参考答案:
enum
知识点30:
对于ifelse结构,else一般与最接它的if相匹配,编程时最好采用恰当的缩进格式。
示例54:
有如下程序:
#include
intmain(void)
{
intx=16,y=30,z=40,flag=9,p=80;
if(xif(zelseif(!
p)x=p+flag;
elsex=y+z+p;
printf("%d\n",x);
return0;
}
运行结果是:
参考答案:
150
点评:
上面程序ifelse结构缩进格式恰当,容易看出else与if的匹配关系,由于关系表达式“x>y”为假,所以直接出跳if结构,显示x的值16。
知识点31:
switch语句执行时,首先计算switch的判断表达式,并以此值去依次找与之相等的case标号值,找到后就将流程转到该标号处,执行后面各语句。
示例55:
有如下程序:
#include
intmain(void)
{
intn=0,x=0,y=0;
switch(n)
{
case0:
y++;
case1:
x++;
break;
case2:
x++;
y++;
}
printf("%d,%d\n",x,y);
return0;
}
运行结果是:
参考答案:
1,1
点评:
由于n=0,所以从case0后面的语句开始执行,执行到break时跳出switch结构。
知识点32:
逗号表达式的一般形式可以扩展为“表达式1,表达式2,表达式3,……,表达式n”,它的值为表达式n的值。
示例56:
有如下程序:
#include
intmain(void)
{
inta=10;
a=(3,6,++a,a+9);
printf("%d\n",a);
return0;
}
运行结果是:
参考答案:
20
知识点32:
对于C语言的表达式,如果表达式的值为0,表示逻辑假,如果表达式的值非0,表示逻辑真。
示例57:
有以下程序:
#include
#include
intmain(void)
{
intk=8;
while(--k)printf("%d\n",k-=6);
return0;
}
运行结果是:
参考答案:
1
点评:
第1次循环时,“--k”值为7,为真,并且k的值为7,经过“k-=6”后,k的值为1,所以显示1,第2次循环时,“--k”值为0,循环结束。
示例58:
有以下程序:
#include
intmain(void)
{
intx=-6;
while(x++);
printf("%d\n",x);
return0;
}
运行结果是:
参考答案:
1
点评:
当while条件“x++”为假时,“x++”的值为0,也就是取出x的值为0,然后再将x的值加1,所以x的值变为1。
示例59:
有以下程序:
#include
intmain(void)
{
inti=1;
do
printf("%d",i);
while(--i);
printf("%d\n",i);
return0;
}
运行结果是:
参考答案:
1
点评:
第1次循环时,i的值为1,显示1,条件“--i”的值为0,i的值也变为0,所以第2个printf语句显示0。
知识点33:
简单递归函数通常对应数学中递推式,可简单地将递推式中的递推条件用if语句表示来进行编程。
示例60:
试用递归编程实现求阶乘n!
的函数,并编写测试程序。
分析:
求阶乘函数f(n)=n!
=1*2*…*n可用递推式表示如下:
具体递归函数及测试程序如下:
#include
intf(intn)
{
if(n==0)return1;
elsereturnn*f(n-1);
}
intmain(void)
{
printf("%d\n",f(6));
return0;
}
示例61:
试用递归编程实现求累加和1+2+3+…+n的函数,并编写测试程序。
分析:
求求累加和1+2+3+…+n的函数可用递推式表示如下:
具体递归函数及测试程序如下:
#include
ints(intn)
{
if(n==0)return0;
elsereturnn+s(n-1);
}
intmain(void)
{
printf("%d\n",s(10));
return0;
}
知识点34:
函数返回值类型由函数首部说的函数类型决定,与“return表达式”中的表达式类型无关。
示例62:
有以下程序:
#include
intf(doublex,doubley)
{
returnx+y;
}
intmain(void)
{
intw=f(1.3,2.6);
printf("%d\n",w);
return0;
}
运行结果是:
参考答案:
3
点评:
调用函数f(1.3,2.6)时,“returnx+y;”表达式的值为3.9,由于函数类型为整型,所以将3.9转抽为整型3作为函数的返回值。
知识点34:
通常采用推递方式在求递推函数的值。
示例63:
有以下程序:
#include
intfun(intx)
{
if(x==0)return2;
elseif(x==1)return5;
elseif(x==2)return9;
elsereturnx+fun(x-3);
}
intmain(void)
{
printf("%d\n",fun(6));
return0;
}
运行结果是:
参考答案:
11
点评:
fun(6)=6+fun(3)=6+3+fun(0)=6+3+2=11。
知识点35:
不能通过函数形参改变实参的值。
示例64:
有以下程序:
#include
voidf(int*p){p=p+2;}
intmain(void)
{
inta[]={1,2,3},*p=a;
f(p);
printf("%d\n",*p);
return0;
}
运行结果是:
参考答案:
1
点评:
调用函数“f(p);”后,实参p的值不变,也为a,由于数组名变指向下标为0的元素的指针,也就是p=&a[0],所以*p=a[0]=1。
知识点36:
对于数组,通常采用依次比较方式求最大值(最小值)。
示例65: