1. What will be the output of the following C code? #include <stdio.h> int main(int argc, char* argv[]) { int b=3; int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr; *(ptr++) += 123; printf("%d, %d\n", *ptr, *(++ptr)); return 0; } 2. 下面程序的结果是多少? #include <stdio.h> int main(int argc, char* argv[]) { unsigned char a = 0xA5; unsigned char b = ~a>>4; printf("b = %d\n", b); return 0; } 3. 下面程序的结果是: #include <stdio.h> int main(int argc, char* argv[]) { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char * b = (char *)&a; printf("%08x, %08x\n", i, *b); return 0; } 4. 用一个表达式,判断一个数X是否为2的N次方(2,4,8,…),不可用循环语句。 5. 下面程序的结果是: #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { int count = 0; int m = 9999; while(m){ count++; m = m & (m - 1); } cout << count << endl; return 0; } 6. 不用判断语句,找出两个数中比较大的。 7. 如何将a、b的值交互,且不用任何中间变量。 8. 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”? 9. 头文件中的ifndef/define/endif的作用? #pragma once的作用? 10. 结构体内存对齐问题。 11. 以下代码的输出是? char var[10]; int test(char var[]){ return sizeof(var); } 12. 写出下面程序的运行结果。 int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; int *p, *q; p = a; q = &a[2]; cout << a[q - p] << endl; 13. 解释下面这段代码: int (*a)[10]; a++; 14. 以下程序的输出是: int a[] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a + 1); cout << *(a+1) << endl; cout << *(ptr - 1) << endl; 15. 什么是智能指针? 16. Please write out the program output. #include <stdlib.h> #include <time.h> #define LOOP 1000 int main(int argc, char* argv[]){ int rgnC = 0; srand((unsigned int)time(NULL)); for (int i=0; i<LOOP; i++){ int x = rand(); int y = rand(); if (x*x + y*y < RAND_MAX * RAND_MAX) rgnC++; } printf("%d\n", rgnC); return 0; } 17. 下面程序的输出结果是: #include <iostream> #include <string> using namespace std; class Base{ private: int m_i; int m_j; public: Base(int i):m_j(i), m_i(m_j){ } Base():m_j(0), m_i(m_j){ } int GetI(){ return m_i; } int GetJ(){ return m_j; } }; int main(int argc, char* argv[]){ Base base(98); cout << base.GetI() << endl << base.GetJ() << endl; return 0; } 18. 请讲述Heap与Stack的差别。 19. 写一个字符串拷贝函数strcpy;为什么strcpy的返回值类型为char *。 20. 如何判断一个单向链表是否有环路? 21. 写出判断ABCD四个表达式的是否正确,若正确, 写出经过表达式中 a的值。 int a = 4; (A)a += (a++); (B) a += (++a) ; (C) (a++) += a; (D) (++a) += (a++); 22. 下面程序的输出为: union{ ### 知识点总结 #### 1. C代码输出解析 **题目描述:** ```c #include <stdio.h> int main(int argc, char* argv[]) { int b=3; int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr; *(ptr++) += 123; printf("%d, %d\n", *ptr, *(++ptr)); return 0; } ``` **知识点解析:** - `*(ptr++)` 表示先取当前指针所指向的值,然后指针自增。因此,`*(ptr++) += 123` 实际上是对数组的第一个元素进行操作,即 `arr[0] += 123`,所以 `arr[0]` 的值变为 `129`。 - `printf("%d, %d\n", *ptr, *(++ptr));` 打印 `arr[1]` 和 `arr[2]` 的值。由于 `ptr` 已经指向了 `arr[1]`,`*(++ptr)` 将 `ptr` 增加到 `arr[2]` 的位置并取值。 **答案:** 输出为 `7, 8`。 --- #### 2. 字符运算结果解析 **题目描述:** ```c #include <stdio.h> int main(int argc, char* argv[]) { unsigned char a = 0xA5; unsigned char b = ~a>>4; printf("b = %d\n", b); return 0; } ``` **知识点解析:** - `~a` 对 `a` 取反。 - `0xA5` 的二进制表示为 `10100101`,取反后得到 `01011010`。 - `>>4` 表示右移四位,即 `00000101`,对应的十进制值为 `5`。 **答案:** 输出为 `b = 5`。 --- #### 3. 整型与字符型转换解析 **题目描述:** ```c #include <stdio.h> int main(int argc, char* argv[]) { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char * b = (char *)&a; printf("%08x, %08x\n", i, *b); return 0; } ``` **知识点解析:** - `unsigned int a = 0xFFFFFFF7`,该整型值的十六进制形式为 `FFFFFFF7`。 - `unsigned char i = (unsigned char)a`,`i` 为 `0x07`。 - `char * b = (char *)&a`,`b` 指向 `a` 的最低位地址。 - `*b` 的值取决于字节序。对于小端系统,`*b` 为 `0x07`;对于大端系统,`*b` 为 `FF`。 **答案:** 输出为 `0x07, 0x07`(假设小端系统)。 --- #### 4. 判断是否为2的N次方 **知识点解析:** 要判断一个正整数 `X` 是否为2的幂,可以使用如下表达式: ```c !(X & (X - 1)) ``` 如果 `X` 是2的幂,那么 `X - 1` 的二进制表示中所有 `X` 的低位0之后的1都会变成0,而那些0则会变成1。`X` 和 `X - 1` 进行按位与运算,结果必为0。 --- #### 5. 计算二进制中1的个数 **题目描述:** ```cpp #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { int count = 0; int m = 9999; while(m){ count++; m = m & (m - 1); } cout << count << endl; return 0; } ``` **知识点解析:** - `m & (m - 1)` 操作会清除 `m` 二进制表示中最右边的一个1。 - 循环执行直到 `m` 变为0,此时 `count` 即为 `m` 中1的个数。 **答案:** 输出为 `14`(因为 `9999` 的二进制中有14个1)。 --- #### 6. 不用判断语句找出两个数中较大的 **知识点解析:** 可以利用条件运算符 `?:` 或位运算来实现,这里介绍一种使用位运算的方法: ```c max(a, b) = b ^ ((a ^ b) & -(a < b)) ``` 其中,`a < b` 结果为0或1,当 `a < b` 时,`-(a < b)` 为-1(即全1),否则为0。 --- #### 7. 交换两个变量的值而不使用临时变量 **知识点解析:** 使用加减法或异或运算都可以实现。 - **加减法:** ```c a = a + b; b = a - b; a = a - b; ``` - **异或法:** ```c a = a ^ b; b = a ^ b; a = a ^ b; ``` --- #### 8. C++调用C编译器编译后的函数 **知识点解析:** 在C++中,如果需要调用由C编译器编译的函数,需要使用 `extern "C"` 来告诉编译器按照C语言的方式来链接这个函数,避免C++的名字修饰机制导致的命名冲突。 --- #### 9. 头文件中的预处理指令作用 **知识点解析:** - `ifndef`、`define` 和 `endif` 组合用于防止头文件被重复包含。 - `#pragma once` 也是用来防止头文件被多次包含的一种方法,但不是所有编译器都支持。 --- #### 10. 结构体成员对齐问题 **知识点解析:** 结构体成员对齐是为了提高数据访问效率。编译器通常会自动调整成员的偏移量,使得每个成员的地址能够满足其类型的对齐要求。可以通过设置编译器选项或使用特定的属性来控制对齐方式。 --- #### 11. 数组大小的计算 **题目描述:** ```c char var[10]; int test(char var[]){ return sizeof(var); } ``` **知识点解析:** `sizeof(var)` 在函数内部返回的是指针的大小,而非数组的大小。这是因为传递给函数的是数组的指针,而不是整个数组。 **答案:** 返回值为 `sizeof(char*)` 的大小,通常是4或8。 --- #### 12. 数组下标计算 **题目描述:** ```cpp int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; int *p, *q; p = a; q = &a[2]; cout << a[q - p] << endl; ``` **知识点解析:** - `q - p` 计算的是指针之间的差值,即 `2`。 - `a[q - p]` 实际上是 `a[2]`,因此输出的是 `2` 的值。 **答案:** 输出为 `2`。 --- #### 13. 指针数组的理解 **题目描述:** ```c int (*a)[10]; a++; ``` **知识点解析:** - `int (*a)[10]` 表示 `a` 是一个指向含有10个整数元素的数组的指针。 - `a++` 使 `a` 指向下一个这样的数组。 --- #### 14. 数组指针运算 **题目描述:** ```cpp int a[] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a + 1); cout << *(a+1) << endl; cout << *(ptr - 1) << endl; ``` **知识点解析:** - `*(a+1)` 输出数组第二个元素的值,即 `2`。 - `ptr` 指向数组 `a` 的下一个数组的位置。 - `*(ptr - 1)` 实际上是指向 `a` 的末尾元素,输出 `5`。 **答案:** 输出分别为 `2` 和 `5`。 --- #### 15. 智能指针概念 **知识点解析:** 智能指针是一种封装了指针的类模板,它可以自动管理对象的生命周期,通过析构函数自动释放内存,从而避免内存泄漏。 --- #### 16. 随机数统计 **题目描述:** ```c #include <stdlib.h> #include <time.h> #define LOOP 1000 int main(int argc, char* argv[]){ int rgnC = 0; srand((unsigned int)time(NULL)); for (int i=0; i<LOOP; i++){ int x = rand(); int y = rand(); if (x*x + y*y < RAND_MAX * RAND_MAX) rgnC++; } printf("%d\n", rgnC); return 0; } ``` **知识点解析:** - 使用 `srand` 初始化随机种子,确保每次运行程序都能得到不同的随机序列。 - `RAND_MAX` 表示最大随机数,该程序统计满足一定条件的随机数对的数量。 **答案:** 输出值取决于随机数的分布,但大约为 `LOOP / 4`,即 `250`。 --- #### 17. 类构造函数顺序解析 **题目描述:** ```cpp class Base{ private: int m_i; int m_j; public: Base(int i):m_j(i), m_i(m_j){} Base():m_j(0), m_i(m_j){} int GetI(){ return m_i; } int GetJ(){ return m_j; } }; int main(int argc, char* argv[]){ Base base(98); cout << base.GetI() << endl << base.GetJ() << endl; return 0; } ``` **知识点解析:** - 构造函数中初始化列表的顺序决定了成员变量的初始化顺序。 - `Base(98)` 时,`m_j` 先被初始化为 `98`,再用 `m_j` 的值初始化 `m_i`。 **答案:** 输出为 `98` 和 `98`。 --- #### 18. 堆栈区别 **知识点解析:** - **堆区:** 动态分配的内存空间,由程序员手动申请和释放。 - **栈区:** 自动分配的内存空间,用于存放局部变量等,随函数调用入栈出栈。 --- #### 19. 字符串拷贝函数及其返回值类型 **知识点解析:** - `strcpy` 函数用于复制一个字符串到另一个字符串。 - 返回值类型为 `char *` 的原因是方便用户进行链式调用,例如 `strcat(strcpy(dest, src), "additional string");`。 --- #### 20. 单向链表环检测 **知识点解析:** 可以使用快慢指针法(Floyd's Cycle-Finding Algorithm)来检测单向链表是否存在环路。具体步骤如下: 1. 定义两个指针 `slow` 和 `fast`,均指向链表头部。 2. `slow` 每次移动一步,`fast` 每次移动两步。 3. 如果存在环,则 `fast` 最终会追上 `slow`。 4. 如果 `fast` 指针到达链表尾部,则不存在环。 --- #### 21. 表达式解析及变量值变化 **题目描述:** ```c int a = 4; (A)a += (a++); (B) a += (++a) ; (C) (a++) += a; (D) (++a) += (a++); ``` **知识点解析:** - **A:** `a += (a++)`,先计算 `a++`,`a` 的值变为5,再执行 `a += 4`,最终 `a` 的值为9。 - **B:** `a += (++a)`,先执行 `++a`,`a` 的值变为5,再执行 `a += 5`,最终 `a` 的值为10。 - **C:** `(a++) += a`,先执行 `a` 的值为4,再执行 `a += 4`,最终 `a` 的值为8,然后 `a` 的值变为9。 - **D:** `(++a) += (a++)`,先执行 `++a`,`a` 的值变为5,再执行 `a += 5`,最终 `a` 的值为10,然后 `a` 的值变为11。 **答案:** `a` 的最终值分别为9、10、9、11。 --- #### 22. 联合体变量解析 **题目描述:** ```c union{ int i; char x[2]; }a; int main(int argc, char* argv[]){ // ... } ``` **知识点解析:** 联合体 `union` 允许不同类型的变量共享同一段内存区域。在这个例子中,`a.i` 和 `a.x` 共享相同的内存空间,因此只能使用其中一个成员。























- clearaelc2014-05-04总结得很全面

- 粉丝: 7
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 移动端jQuery修正Web页面滑动时div问题的两则实例.doc
- Excel公式的应用PPT课件.ppt
- 课件制作人:张勤勤-计算机网络演示教学.ppt
- oracle分区表原理概述.docx
- 2023年计算机等级考试二级辅导讲义.doc
- 数据采集系统的设计与实现的开题报告.docx
- EBusiness电子商务系统需求分析报告文案.doc
- 超清晰教学excel透视表与透视图 ppt.pptx
- 软件方案的格式及.docx
- 基于PLC的输液监控系统设计.docx
- 基于高速互联网的P2P传播应用的开题报告.docx
- VisualBasic编程计算中低压条件下双组分体系泡露点温度.doc
- robot-framework自动化框架介绍及demo演示.ppt
- 试论互联网对大学课堂教学的影响.docx
- 上海交大1-6秋网络继续教育计算机文化基础第三次作业教材课程.docx
- 外啮合齿轮泵CAD的研究的开题报告.docx


