1、请写出下面程序的输出结果:
int count = 3;
int main(void)
{
int i, sum, count = 2;
for(i=0,sum=0; i { static int count = 4; count++; if(i%2 == 0) { extern int count; count++; sum += count; } sum += count; } printf("%d %d\n",count, sum); return 0; } 答案: 4 20 2、请写出下面程序的输出结果: void func(char str[50]) { printf("A %d B %d ",sizeof(str), strlen(str)); } int main(void) { char stra[] = "HelloWorld"; char *strb = stra; printf("C %d D %d ",sizeof(stra), sizeof(strb++)); func(++strb); printf("E %d F %d\n",strlen(stra), strlen(strb++)); return 0; } 答案:C 11 D 4 A 4 B 9 E 10 F 9 3、请写出下面程序的输出结果: #include int func(std::vector { static int k = 2; std::vector for(it = vec.rbegin(); it!=vec.rend(); ++it) { k += *it%2==0? ++*it: (*it)++; } return k; } int main(void) { std::vector for(int i = 0; i<4; i++) { vec.push_back(i); printf("%d ",func(vec)); } return 0; } 答案: 3 5 10 18 4、请写出下面程序的输出结果: class Base { public: int m_a; Base(int a=2):m_a(a) { printf("A %d ",m_a); } virtual ~Base() { printf("B %d ",m_a); } }; class Derived:public Base { public: Derived(int a=4):Base(a) { printf("C %d ",m_a); } ~Derived() { printf("D %d ",m_a); } }; int main(void) { Base *aa,bb; aa = new Derived; delete aa; return 0; } 答案: A 2 A 4 C 4 D 4 B 4 5、请写出下面程序的输出结果: class Base { public: int m_a,m_b; Base(int a = 2,int b = 5):m_a(a),m_b(b) { } int func_a() { return m_a - m_b; } virtual int func_b() { return m_a + m_b; } }; class Derived:public Base { public: Derived(int a = 4, int b = 7):Base(a, b) { } virtual int func_a() { return m_b + m_a; } int func_b() { return m_b - m_a; } }; int main(void) { Base *aa, *bb; aa = new Base(4, 7); bb = new Derived(3, 5); printf("%d %d %d %d\n",aa->;func_a(), aa->;func_b(), bb->;func_a(), bb->;func_b()); delete aa; delete bb; return 0; } 答案: -3 11 -2 2 6、请写出下面程序的输出结果: struct SC { int a; int b; int c; }; struct SD { int a; int b; int c; int d; }; int main(void) { struct SC c1[] = {{3},{4},{5},{6}}; struct SD *c2 = (struct SD*)c1 + 1; printf("%d %d %d %d\n",c2->;a,c2->;b,c2->;c,c2->;d); return 0; } 答案:0 0 5 0 7、请写出下面程序的输出结果: int func(int n) { int k = 1; if(n >; 0) { k += func(--n); printf("%d ", n); k += func(--n); } return k; } int main(void) { int a = 3; printf("%d\n",func(a)); return 0; } 答案:0 1 2 0 9 1、函数checkstr判断一字符串是不是对称的。其中msg为输入的字符串,对称返回0,不对称返回-1,实现该函数。 答案:int checkstr(const char *msg); int checkstr(const char *msg) { int len = strlen(msg); int i, j; for(i = 0,j = len-1; i <= j; i++,j--) { if(msg[i] != msg[j]) break; } if(i>;j) return 0; else return -1; } 2、给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针,链表的倒数第0个节点为链表的尾节点(尾节点的next成员为NULL) 答案: typedef struct Node { struct Node *next; }NODE; NODE* findnode(NODE *head,unsigned int k); 思路:在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针p保持不动; 在第k-1步开始,第二个指针p也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针pcur到达链表的尾结点时,第二个指针指针p正好是倒数第k个结点。 这种思路只需要遍历链表一次。对于很长的链表,只需要把每个结点从硬盘导入到内存一次。因此这一方法的时间效率比较高。 typedef struct Node { struct Node *next; }NODE; NODE* findnode(NODE *head, unsigned int k) { if(head==NULL) return NULL; NODE *p, *pcur; pcur = head; for(unsigned int i = 0; i < k; i++) { if(pcur->;next != NULL) //在第k-1步之前,第二个指针p保持不动 pcur = pcur->;next; else return NULL; //k比链表中节点的数目要大,找不到倒数第k个节点,直接返回空 } p = head; while(pcur->;next) { pcur = pcur->;next; p = p->;next; } return p; } 1、简述动态链接库DLL和静态链接库lib的差别。 答案:差别:静态lib将各个调用函数都封装在生成的可执行文件中(.exe),而动态DLL则在需要时才动态地装载和所载DLL文件,动态DLL还可以利用到操作系统中既存的库文件。 2、请简述MFC中的窗口收到WM_PAINT消息是如何处理的,什么情况下会产生WM_PAINT消息。 答案:处理:BeginPaint开始画,就是用白刷去掉原窗口,GetClientPaint获得窗口显示区域和尺寸等信息并绘制,EndPaint释放绘图句柄。 3、请简述Critical Section 、Mutex、Semaphore的功能和差别 答案:功能:都是用来解决共享变量或区域的访问问题,防止读写冲突。区别:Critical Section是在用户方式下实现同步,其他两个是系统内核对象。Mutex是只有获得锁的进程才能释放,而semaphore可由其他进程释放,一般mutex用于保护关键代码区域,而semaphore用于保护变量。 4、简述多线程程序对比单线程程序的优点和缺点。 答案:优点:多线程程序可以分时处理,用户因此可以同时高效地执行多个任务,用户体验好;缺点:线程切换有额外的代价,所以花费的总时间要长于单线程程序。