1、
- int a;
- #define M(x,y) (x/y)
- a = M(4+2, 3)
- a=?
这是考察宏定义的知识,宏定义就是简单的替换。
M(4+2, 3)的展开式为4+2/3。
所以a=4。
下面的这两个例子可能有助于更好的理解:
#define m(x) x*x*(x+1)
int a=2,b=3;
m(a+b)的结果是26
m(a+b)的展开式是a+b*a+b*(a+b+1),结果是26
#define m(x) (x)*(x)*(x+1)
int a=2,b=3;
m(a+b)的结果是150
m(a+b)展开式是(a+b)*(a+b)*(a+b+1)结果是5*5*6=150
2、
- int f(int x)
- {
- static int k = 0;
- x += k++;
- return x;
- }
- int i;
- i = f(3)*f(2);
- i = ?
k是一个静态变量,它的作用相当于全局变量,但是它定义在了函数内部,外部是不可见的,不可见的全局静态变量。
所以执行完f(3)之后,k=1,再执行f(2)时,k的值还是1,执行完f(2)后,k=2.
最后答案是 9
3、在X86,32位环境下,下面程序的输出结果是什么?
- double dArrary[2] = {4, 8}, *p, *q;
- p = &dArrary[0];
- q = p+1;
- cout<<q-p<<endl;
- cout<<(int)q-(int)p<<endl;
这个题考查 指针类型和指针的加减。这个题需要在 visual studio下面执行才能不报错
p,q是指针,即指针变量,他们的类型是double* ,所以他们的在内存中的step是8
q-p表示元素相差的个数,强制转换为地址 (int)q-(int)p表示把两个元素的地址值相减。
最后答案是 1 和 8
4、计算下列sizeof的值。
- char str[] = "http://www.tendyron.com/";
- char *p = str;
- int n = 10;
- sizeof(str) = 25
- sizeof(p) = 4
- sizeof(n) = 4
- void Foo(char str[100]){
- sizeof(str) = 4;
- void *p = malloc(100);
- sizeof(p) = 4;
在32位机器上,无论什么指针都占4个字节,包括void *类型。
5、下面程序输出什么?
- void Foo(char **p, int num)
- {
- *p = (char *)malloc(num);
- }
- void Test(void)
- {
- char *str = NULL;
- Foo(&str,100);
- strcpy(str, "hello");
- printf("%s", str);
- }
输出hello。
6、下面的程序输出什么?
- void Test(void)
- {
- char *str = (char *)malloc(100);
- strcpy(str, "world");
- free(str);
- if(str != NULL)
- {
- strcpy(str, "world");
- printf("%s", str);
- }
- }
free(str)后必须手动将str置为NULL,否则它并不是指向NULL。
free(str);释放了指向的内存,str并不为NULL,而是一个随机数,俗称野指针。
free函数只是把malloc申请到的内存块中某个特殊的标志变了一下而已,并没有立刻就清空块中的数据。是否释放这块内存是操作系统自己来判断的,而且释放后是否会对内存块链进行调整,使内存碎片减少,都是用操作系统自己来进行的。
输出world。
7、下面程序的输出结果是什么?
- char *GetMemory()
- {
- char p[] = "hello world";
- return p; //这样返回是错误的
- }
- char *str = NULL;
- str = GetMemory();
- printf("%s", str);
8、说明下面的程序有什么问题
- char *_strcpy(const char *strSrc)
- {
- static char str[260];
- strcpy(str, strSrc);
- return str;
- }
9、一下两个循环的优先
- for(int i = 0; i < N; i++)
- {
- if(condition)
- DoSomeThing();
- else
- DoOtherSomeThing();
- }
- if(condition)
- {
- for(int i = 0; i < N; i++)
- DoSomething();
- }
- else
- {
- for(int i = 0; i < N; i++)
- DoOtherSomething();
- }
10、简答Windows平台动态链接库的两种调用方式,以及静态库和动态库的区别。
11、已知链表结点head,写一个函数把这个链表逆序,结构如下
- strcut Node
- {
- int data;
- Node *next
- };
- typedef struct Node Node;
12、在32位系统上,用程序将16进制字符串,如“FE1234”转化为一个长整型。
13、写一函数IsBigEndian,判断计算机的字节存储顺序是升序还是降序。
14、有28个人买水,3个空瓶可以换一瓶水,请问至少买多少瓶水?
15、教授从2到9的数字中选出两个,把和告诉甲,把积告诉乙,他们轮流猜这个数,甲说:我猜不出,乙说:我也猜不出,甲说:我猜到了,乙说:我也猜到了。请问这两个数是什么?
-------------------------------分析过程-------------------------------------
第一步甲说:“我猜不到”证明和的组合不唯一:满足条件的和:
[15] 6+9,7+8
[8] 2+6,3+5
[7] 2+5,3+4
[14] 5+9,6+8
[10] 2+8,3+7,4+6
[9] 2+7,3+6,4+5
[12] 3+9,4+8,5+7
[13] 4+9,5+8,6+7
[11] 2+9,3+8,4+7,5+6
第二步乙说:“我猜不到”证明积的组合不唯一,满足条件的积:
[24] 3×8,4×6
[18] 2×9,3×6
[12] 2×6,3×4
第三步甲说:“我猜到了”有以下几种情况:
2+6=8 2*6=12(和为8的情况,满足第二步)
3+5=8 3*5=15(和为8的情况,不满足第二步)
2+5=7 2*6=10(和为7的情况,不满足第二步)
3+4=7 3*4=12(和为7的情况,满足第二步)
2+8=10 2+8=16 (和为10的情况,不满足第二步)
3+7=10 3+7=21(和为10的情况,不满足第二步)
4+6=10 4+6=24(和为10的情况,满足第二步)
2+7=9 2*7=14(和为9的情况,不满足第二步)
3+6=9 3*6=18(和为9的情况,满足第二步)
4+5=9 4*5=20(和为9的情况,不满足第二步)
7+8=15 7*8=56(和为15的的情况,不满足第二步)
6+9=15 6*9=54(和为15的情况,不满足第二步)
和为其它值的情况与和为15的的情况类似.
第三步甲说:“我猜到了”证明组合可能是: 2-6 3-4 4-6 3-6
第四步乙说:“我猜到了”有以下几种情况:
如果12,组合可能为2-6,3-4, 2-6,3-4组合的情况下第三步有可能, 所以是乙在第四步不可能猜到
如果18,组合可能为2-9,3-6, 2-9组合的情况下第三步不可能,3-6组合情况下第三步有可能, 所以乙在第四步能确定3-6是唯一的可能,即充分必要条件,所以说猜到了.
如果24,组合可能为3-8,4-6, 3-8组合的情况下第三步不可能,4-6组合情况下第三步有可能, 所以乙在第四步能确定4-6是唯一的可能,即充分必要条件,所以说猜到了.
第四步乙说:“我猜到了”证明组合可能是: 3-6(和为9,积为18) 4-6(和为10,积为24) 中的一种.
最终答案3-6或4-6