循环次数为(end-1)-start+1=end-start(使用等比数列公式:
项数=(an-a0)/delta+1
循环结束后i=end
如果没有溢出,则通过以下公式计算
for(i=start;i<=end;i++)
循环次数为end-start+1
循环结束后i=end+1
6.unsignedshorti;for(i=0;i<40000;i++);循环次数为?
A.40000B.无穷大
答案:
选A
参考表1
unsignedshort范围为0~65535,
该循环不会溢出。
等差数列公式
an=a0+(n-1)*delta
n为项数,也就是循环次数
an=39999,a0=0
delta=1
循环次数=(an-a0)/detla+1=(39999-0)/1+1=40000
7.signedshorti;for(i=0;i<40000;i++);循环次数为?
A.40000B.无穷大
答案为B
参见表1
signedshort数据范围从-32768~32767
循环会溢出
当i=32767的时候,i++使得i溢出到-32768,因此,i永远不可能达到40000。
该循环为死循环。
8.floati;for(i=0.0F;i<400000.0F;i+=1.0F);循环次数为A.400000B.无穷大,答案A
9.floati;for(i=0.0F;i<400000000.0F;i+=1.0F);循环次数为A.400000B.无穷大,答案B
表2
类型说明符
比特数
(字节数)
有效数字
数的范围
单精度
float
32(4)
7
10-38~1038
双精度
double
64(8)
16
10-308~10308
float有效位数为7,当i=399999的时候,执行i++
399999
+1
----------------------------
1加在第6位有效数字上,在7位以内,则不会出现精度不够的情况。
如果是i=399999999.0F,同样执行i+=1.0F
1是加到第9位有效数字上的,会出现精度不够的情况。
具体表现为x+deltax==x
也就是i+=1.0F将不再使i能够继续增大
此时,i永远不会达到400000000.0F,循环成为死循环。
10.printf函数中,%lf对应哪种数据类型?
%lfdouble
%ffloat
%dint
%ldlong
%cchar
%schars[]
%x整数以十六进制显示(小写的abcdef)
%X整数以十六进制显示(大写的ABCDEF)
%uunsignedint
%o整数以八进制显示
11.a的ASCII码是?
97
12.A的ASCII码是?
65
13.0的ASCII码是?
48
14.\n的ASCII码是?
10
15.chars[]="123";strlen(s)的值为?
3
strlen是string.h中声明的库函数,用于显示字符串中除’\0’以外的字符个数。
16.chars[]="123";sizeof(s)的值为?
sizeof是关键字,用于显示变量或数据类型的字节数。
inta;sizeof(a)为4
sizeof(int)为4
chars[]="123";sizeof(s)的值为数组元素个数*每个元素的字节数=4*1=4
这里数组元素个数应包含末尾的’\0’
17.提前退出循环的关键字是?
break;
inti;
for(i=0;i<10;i++)
{
if(i==5)
break;
printf(“%d,”,i);
}
屏幕输出为0,1,2,3,4,
18.提前结束本次循环的关键字是?
continue;
inti;
for(i=0;i<10;i++)
{
if(i==5)
continue;
printf(“%d,”,i);
}
屏幕输出为0,1,2,3,4,6,7,8,9,
19.有一个关键字可以构造出while循环,该关键字是?
答案可以是goto,也可以是for
以下三个循环的作用是一样的,
都是在屏幕上输出0,1,2,3,4,5,6,7,8,9,
inti;
i=0;
while(i<10)
{
printf(“%d,”,i);
i++;
}
inti;
i=0;
LOOP:
if(i<10)
{
printf(“%d,”,i);
i++;
gotoLOOP;
}
inti;
for(i=0;i<10;i++)
{
printf(“%d,”,i);
}
20.请用宏定义给unsignedint一个别名UINT
#defineUINTunsignedint
21.请用typedef给unsignedint一个别名uint
typedefunsignedintUINT;
注意typedef后面有;
而且两者在别名和原名的顺序上是相反的。
22.如果要用到printf,需要include哪个头文件?
23.如果需要用到sqrt,需要include哪个头文件?
printf,scanf,getchar,putchar使用之前都得#include
sqrt,sin,cos使用之前都得#include
strlen使用之前都得#include
24.0x22转化为十进制为___34
0x22=2*161+2*160=34
25.22转化为十六进制
22/16=122%16=6
1/16=01%16=1
22转化为16进制为0x16
222转化为16进制
222/16=13222%16=14
13/16=013%16=13
14转化为十六进制为E
13转化为十六进制为D
222转化为16进制为0xDE
26.22转化为二进制数为______(前面的0不要省略,总共写出8位数字)
思路:
先转化为16进制,再由16进制转化为2进制。
22转化为16进制为0x16,0x16转化为二进制为00010110
0x22转化为二进制为_____(前面的0不要省略,总共写出8位数字)
0x22转化为二进制为00100010
对于十六进制到二进制的转化
可以现先在草稿纸上写出如下表格,然后查表
表3
十进制
0
1
2
3
4
5
6
7
十六进制
0
1
2
3
4
5
6
7
二进制
0000
0001
0010
0011
0100
0101
0110
0111
十进制
8
9
10
11
12
13
14
15
十六进制
8
9
A
B
C
D
E
F
二进制
1000
1001
1010
1011
1100
1101
1110
1111
27.0x22转化为二进制为____(前面的0不要省略,总共写出8位数字)
直接查表
0x22=00100010
28.int的上限为多少亿?
(写出数字即可,不要带单位)
int范围-21亿~21亿,见表1
29.编译程序程序总共有四部,第一步是?
A.预处理B.链接
编译程序程序总共有四部:
预处理-》编译-》汇编-》链接
30.预处理指令前通常有什么符号?
#
#define
#include
#ifdef
#endif
31.void是否为合法的变量名?
(填T或F)F
32._123是否是合法的变量名?
(填T或F)T
合法变量名以下划线_和字母开头,中间可以有数字。
不能用关键字。
void为关键字,不能作为合法变量名。
但是Void可以,因为C语言区分大小写
33.chara[1000000]该数组的定义是否正确?
(填T或F)T
sizeof(a)=1000000*sizeof(a[0])=1000000<1024*1024=1MBytes
因此在运行的时候,不会发生栈溢出错误。
34.inta[1000000]该数组的定义是否正确?
(填T或F)F
sizeof(a)=1000000*sizeof(a[0])=1000000*4>1024*1024=1MBytes
编译的时候不会报错,运行的时候,会报栈溢出错误。
提示,定义函数中的数组有字节限制,最大不能超过1MBytes
35.inta[3];请问sizeof(a)=?
sizeof(a)=sizeof(a[0])*3=4*3=12
36.inta[3][4];请问sizeof(a)=?
sizeof(a)=sizeof(a[0][0])*(3*4)=4*12=48
37.inta[3];请问最后一个元素为?
(填写a[x])
inta[N];
a数组中最后一个元素为a[N-1]
第一个元素为a[0]
38.inta[3][4];请问最后一个元素为?
(填写a[x][y])
inta[M][N];
a的最后一个元素为a[M-1][N-1]
a的第一个元素为a[0][0]
39.定义在函数体外的变量称之为全局变量。
(填写T或F)T
40.局部变量只能在定义该变量的函数内使用。
(填写是或否)T
#include
inti=10;//i为全局变量
voidprint()
{
printf(“i=%d”,i);
//正确,全局变量可以被定义在它下面的所有函数引用,这里包括print和main//都可以使用i
printf(“j=%d”,j);
//正确,局部变量只能在定义它的函数内使用,这里j只能在main中使用
}
intmain()
{
intj=5;//j为定义在main中的局部变量,只能在main中使用
printf(“i=%d”,i);
//正确,全局变量可以被定义在它下面的所有函数引用,这里包括print和main//都可以使用i
printf(“j=%d”,j);
//正确,局部变量只能在定义它的函数内使用
}
41.charc='\123';printf("%c\n",c);打印输出为_____
‘\123’这是八进制,先转化成10进制
1238=1*82+2*81+3*80=64+16+3=83
因65为A的ASCII码,可以推出83为S
42.intb=3;inta=(b<2?
0:
1);printf("%d\n",a);
?
:
为三目运算符
表达式1?
表达式2:
表达式3
如果表达式1为真,这返回表达式2的值,否者返回表达式3的值。
b<2的值为假,所以需要返回表达式3也就是1
因此a=1
43.intb=3;inta=(b=2?
0:
1);printf("%d\n",a);
?
:
为三目运算符
表达式1?
表达式2:
表达式3
因为=的优先级,小于三目运算符,所以先看?
前面的常量表达式2,
表达式的值就是2
2不等于0,?
前面的表达式为真。
因此a=表达式2的值=0
44.unsignedchari=0xFF;i&=~(unsignedchar)(1<<5);求i(答案以0x开头)
整数常量在C语言中,默认是int型的,因此1在内存中总共占用4字节,32位
00000000000000000000000000000001
1<<5表示1左移5位,后面补0
00000000000000000000000000100000
(unsignedchar)(1<<5)将32位转化为8位
00100000
~((unsignedchar)(1<<5))是按位取反操作
11011111
i+=1i=i+1
i&=~((unsignedchar)(1<<5))也就是i&=11011111,
等价于i=i&11011111=11111111&11011111=11011111=0xDF
&为按位与操作,有0为0,全1才为1
45.unsignedchari=0x11;i|=(unsignedchar)(1<<5);求i(答案以0x开头)
(unsignedchar)(1<<5)=001000002
|为按位或操作,有1为1,全0才为0
i=0x11=000100012
i|=(unsignedchar)(1<<5)也就是i|=001000002
等价于i=i|001000002=000100012|001000002=0011000122=0x31
四位二进制数可以转化为一位十六进制数,从低位(右边)向左数位数,四位一组,不足四位的可以补0.
46.写出与printf相对应的输入函数的名称为scanf
printf用于格式输出,scanf用于格式输入
47.写出读取一个字符的输入函数的名称
putchar用于向屏幕输出一个字符
与putchar相对应的输入函数为getchar,getchar用于从键盘输入读取一个字符
48.inti=1,j=2;
if(i==1||j++)i++;请问j=?
if后的i++时候执行取决于表达式i==1||j++是否为真
因为||为逻辑或操作,有真为真,全假才为假
因此,对于表达式1||表达式2,如果表达式1为真,则无论表达式2的取值,整个表达式都为真。
因此,计算机在这种情况下,会跳过表达式2的计算。
i==1成立,因此i==1||j++必定为真,因此计算机跳过j++的计算,直接计算if后的语句i++。
因此,j++不会被执行。
j=2
49.inti=1,j=2;
if(i==1&&j++)i++;请问j=?
&&为逻辑与操作,有假为假,全真才为真
对于表达式1&&表达式2,如果表达式1为假,则无论表达式2的取值如何,整个表达式都为假。
因此,这种情况下,计算机会跳过表达式2。
i==1成立,因此系统将计算表达式2也就是j++的值,j++将被执行,j=3
50.inti=0,j=2;if(i==1&&j++)i++;请问j=?
i==1不成立,因此系统跳过计算表达式2,j++将不被执行,j=2
51.#defineMAX(a,b)((a)>(b)?
(a):
(b)),给a,b加括号是为了避免_____问题(三个字)优先级
如果不使用小括号,#defineMAX(a,b)a>b?
a:
b
inta=1,b=2,c=3;
intd;
d=MAX(MAX(a,b),c);//求a,b,c三个数的最大值
等价于d=MAX(a,b)>c?
MAX(a,b):
c=a>b?
a:
b>c?
a>b?
a:
b:
c;
很可能会出现优先级问题。
52.intn=5;inta[n];该数组定义是否正确?
(T或F)F
数组定义时候,[]中应为整形常量表达式。
53.数组名右边的方括号中必须为常量表达式?
(T或F)F
inta[5]={1,2,3,4,5};
printf(“%d\n”,a[4]);//这里的4是常量表达式
反例:
引用数组——整形
inti=4;
printf(“%d\n”,a[i]);//这里i是变量
54.floati;for(i=16000000.0F;i<400000000.0F;i+=1.0F);是一个死循环,如要改错,可修改i为____型(英文)double
因为double精度为15,所以,可避免精度不够的情况。
(见题8和9,表2)
55.#defineDIM(a)sizeof(a)/sizeof(a[0]),该宏定义用于求数组的___A.元素个数B.数组字节数
sizeof(a)为整个数组所有元素的字节数之和,sizeof(a[0])为第一个元素的字节数,由于对于一个数组,其中每一元素的类型和字节数都相等,因此,sizeof(a[0])又表示数组a中每个元素的字节数。
DIM(a)=sizeof(a)/sizeof(a[0])=所有元素的总字节数/单个元素字节数=元素个数
56.switch-case语句中,每个case通常都搭配关键字_______
break
57.所有的ifelse语句都可以用switch-case语句表示?
(T或F)
以下switchcase语句将1,2,3,分别映射成5,7,12
intx=1;
inty;
switch(x)
{
case1:
y=5;break;
case2:
y=7;break;
case3:
y=12;break;
}
对应的ifelse语句是
intx=1;
inty;
if(x==1)
y=5;
elseif(x==2)
y=7;
elseif(x==3)
y=12;
如果需要将(1.54,2.32),(2.4567,3.5498)映射成1,2,则只能用ifelse实现
doublex,y;
if(x>1.54&&x<2.32)
y=1;
elseif(x>2.4567&&x<3.5498)
y=2;
switchcase适用于点对点映射,ifelse既可以实线点对点映射,也可以将某区间映射到点。
58.最大的float型数的数量级是____38
查表2
59.冒泡法用于____(答案为两个字)
排序
60.编译器在编译过程中可以检查源代码的哪一类错误?
A.功能错误B.语法错误
编译器只能检查出语法错误,比如没有加分号,使用了没有定义的变量名等等。
61.如果源码中有一个死循环,那么能否通过顺利编译?
(T或F)
死循环不属于语法错误,所以编译器是检测不到的,可以顺利通过编译。
62.升序指的是由小到大?
(T或F)
升序是由小到大,降序是由大到小
63.C程序的每行中只能写一条语句?
(T或F)
每行可以写多条语句。
比如以下情况是允许的
inti=0;i++;printf(“%d\n”,i);
64.简单变量做实参时,数据传递方式是由实参传给形参,再由形参传回给实参?
(T或F)
简单变量是指的除去数组和指针的情况。
intadd(inta,intb)//a,b为形式参数
{
这里隐含了a=1,b=2
相当于实参被隐含传递给了形参
returna+b;
}
intmain()
{
intc;
c=add(1,2);//1,2为实际参数
}
65.stdlib.h中有个库函数可以用于排序,函数名为____
qsort——快速排序函数
66.如果头文件是位于工程目录下,#include后面用哪种方式A.<>B.""C.A和B均可——B
67.如果头文件位于编译器安装目录下,#include后面用哪种方式A.<>B.""C.A和B均可——C
<>告诉编译器,*.h文件位于编译器目录下。
“”告诉编译器,*.h文件位于工程目录或编译器目录下。
采用这种方式的时候,编译器会先搜索工程目录有没有*.h文件,如果没有才回去编译器目录下找。
因此,对于编译器自带的*.h文件,比如stdio.h,位于编译器目录下,
两种方式都是可以的。
不过,采用<>会加快编译速度,因为编译器不会去工程目录搜索*.h
而对于自己定义.h文件通常都位于工程目录下,所以只能采用””方式
68.已知main函数中有如下语句inta;a=5;intb=6;试问在C编译器能否编译通过?
(T或F)
不能通过。
因为声明变量语句中间,不能插入其它语句。
可以改为
inta=5;
intb=6;
或
inta;
intb=6;
a=5;
69.如果函数定义在main函数的后面,一般会在main前面添加函数的A.函数体B.函数声明
B
函数体就是指的函数定义中的花括号部分。
intadd(inta,intb);//因为函数定于main函数之后,所以必须在main前面先声明,否则编译器会报错。
intmain()
{
intc;
c=add(1,2);
}
intadd(inta,intb)//这里为函数定义,申明和定义的区别在于是否有函数体,也就是花括号部分
{
returna+b;
}
70.头文件中,通常是存放A.函数声明B.函数体
A
大家可以自己打开编译器目录下的stdio.h文件
71.逗号表达式的值等于最后那个逗号后的表达式的值?
(T或F)