C语言非常之经典的笔试题。
2.数据类型(22道)
2.1 用变量a给出下面的定义
(
1
)一个整型数:
int a
。
(
2
)一个指向整型数的指针(一重指针):
int *a
。
(
3
)一个指向指针的的指针,它指向的指针是指向一个整型数的指针(二重指
针):
int **a
。
(
4
)一个有
10
个整型数的数组 :
int a[10]
。
(
5
)一个有
10
个指针的数组,这
10
个指针是指向整型数的(指针数组):
int
*a[10]
。
(
6
)一个指向有
10
个整型数数组的指针(数组指针):
int (*a)[10]
。
(
7
)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(函数指针):
int (*a)(int)
。
(
8
)一个有
10
个指针的数组,这
10
个指针均指向函数,该函数有一个整型参数并返回
一
个整型数(函数指针数组):
int (*a[10])(int)
。
2.2下面的代码输出是什么,为什么?
void
foo(
void
)
{
unsigned
int
a = 6;
int
b = -20;
(a + b > 6)?
printf
(
"> 6"
) :
printf
(
" <= 6"
);
}
答案:
输出是
“>6”
。
解读:
当运算表达式中存在有符号数和无符号数时,有符号数隐式转换成了无符号数
(即底层的补码不变,但是此数从有符号数变成了无符号数)。注意,正数的补码为其
本身,负数的补码为其反码
+1
。因此
-20
变成了一个非常大的正整数,所以该表达式计
算出的结果
”>6”
。
2.3写出float x与“零值”比较的if语句。
答案:
if
(x > -0.000001 && x < 0.000001);
解读:
因为计算机在处理浮点数的时候是有误差的,所以不能将浮点型变量用
“==”
或
“
!
=”
与数字比较,应该设法转化成
“>”
或
“<”
此类形式。
2.4下面代码有什么错误?
#include<stdio.h>
void
main()
{
char
*s =
"AAA"
;
s[0] =
'B'
;
printf
(
"%s"
, s);
}
(
1
)
"AAA"
是字符串常量,
s
是指针,指向这个字符串常量,所以声明
s
的时候就有问
题,应该是
cosnt char* s="AAA"
。
(
2
)然后又因为是常量,所以对是
s[0]
的赋值操作是不合法的。
2.5下面代码输出是什么?
答案:
输出是
14
。
解读:
代码将数值
2
强制类型转换为
int
类型指针,
int
类型指针加
3
相当于指向后面第三
个
int
类型变量的首地址,一个
int
类型变量占
4
个字节,所以加
3
相当于指针往后移了
12
个字节,指向地址