第一篇:经典C语言笔试题,不看后悔
1、请填写 bool , float, 指针变量 与“零值”比较的 if 语句。
提示:这里“零值”可以是 0, 0.0 , FALSE 或者“空指针” 。例如 int 变量 n 与“零值”比较的 if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。
(1)请写出 bool flag 与“零值”比较的 if 语句:
【标准答案】if ( flag ) if ( !flag )
(2)请写出 float x 与“零值”比较的 if 语句:
【标准答案】 const float EPSINON = 0.00001; if ((x <= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“<=”或“<=”此类形式。
无论是float,还是double类型的变量,都有精度限制.
所以一定要避免将浮点变量"=="或"!="与数字比较,应该设法转换成"<="或"<="形式.,
计算机将浮点数0,存储形式是:0.000001
(3)请写出 char *p 与“零值”比较的 if 语句
【标准答案】 if (p == NULL) if (p != NULL)
2、以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。 char str[] = “Hello” ; char *p = str ; int n = 10;
请计算
(1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n ) =
【标准答案】(1)6、(2)4、(3)4
(4)void Func ( char str[100]) { …… ; } 请计算 sizeof( str ) =
只有这个函数被调用了sizeof( str )才能编译通过,否则就不存在sizeof( str ),str也没分配内存。
(5)void *p = malloc( 100 );
请计算sizeof ( p ) =
【标准答案】(4)4、(5)4
3、 long a=0x801010;a+5=?
【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725。
4、用变量a给出下面的定义
e) 一个有10个指针的数组,该指针是指向一个整型数的;
f) 一个指向有10个整型数数组的指针 ;
g) 一个指向函数的指针,该函数有一个整型参数并返 回一个整型数;
h) 一个有10个指针的数组,该指针指向一个函数,该 函数有一个整型参数并返回一个整型数;
【标准答案】e)int * a[10]; f)int (*a)[10] g)int (*a)(int); h) int (*a[10])(int)
5、设有以下说明和定义:typedef union {long i; int k[5]; char c;} DATE;struct data { int cat; DATE cow; double dog;} too;DATE max;则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:_____
【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
6、请问以下代码有什么问题:int main(){ char a; char *str=&a; strcpy(str,"hello"); printf(str); return 0;}
【标准答案】没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
7、请问以下代码有什么问题:
char* s="AAA";printf("%s",s);s[0]='B';printf("%s",s);有什么错?
【标准答案】"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosnt char* s="AAA";然后又因为是常量,所以对是s[0]的赋值操作是不合法的。