第一题
1、以下程序段的输出结果是( )
#include<stdio.h> int main() { char s[] = "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }
A: 12
B: 13
C: 16
D: 以上都不对
答案及解析 A
本题考查的是转义字符 ' \ '占了几个字节长度,我们要知道转义字符可以把其紧挨着的字符原有的意思转换,然后转义字符和后面被转义的作为一个整体占一个字节;
所以上面的程序就是这样:\\ 123456 \123 456 \t
特殊颜色的就代表是转义字符,所以字符串的长度是12
第二题
2、若有以下程序,则运行后的输出结果是( )
#include <stdio.h> #define N 2 #define M N + 1 #define NUM (M + 1) * M / 2 int main() { printf("%d\n", NUM); return 0; }
A: 4
B: 8
C: 9
D: 6
答案及解析 B
本题考查的是#define宏定义的替换,记住是替换,这个很重要。
所以NUM = (M + 1) * M / 2 = (N + 1 + 1) * N + 1 / 2 = (2 + 1 + 1) * 2 + 1 / 2 = 8;
第三题
3、如下函数的 f(1) 的值为( )
int f(int n) { static int i = 1; if(n >= 5) return n; n = n + i; i++; return f(n); }
A: 5
B: 6
C: 7
D: 8
答案及解析 C
本题考查的是static修饰的变量是静态变量,局部静态变量只会初始化一次,所以就是只在第一次进入函数f的时候初始化了,其余没有初始化,i的值一直在增大;
第四题
4、下面3段程序代码的效果一样吗( )
1. intint b; (1)const int *a = &b; (2)int const *a = &b; (3)int *const a = &b;
A: (2)=(3)
B: (1)=(2)
C: 都不一样
D: 都一样
答案及解析 B
本题考查的是const在*的左=左右侧的区别;
const在* 的左侧:限制的是指针指向的对象,可以改变指针,不可以改变指针指向的对象
const在* 的右侧:限制的是指针本身,指针不可以被改变,但是可以改变指针指向的对象
第五题
5、对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对
答案及解析 D
A:这个求一个结构体的大小,要考虑到内存对齐,相关博客在这:http://t.csdnimg.cn/YaDtP
B:因为double类型是有精度的,double只能保留到小数点后15位,所以要判断是否等于0,应该这样比较:a < 1e-15;
C:数组初始化不可以用数组名,数组名代表首元素地址,是常量不可以改变;
D:正确