关于c++笔试题
### 关于C++笔试题知识点解析 #### 一、题目解析 ##### 题目1:函数`foo(2^31-3)`的结果是什么? ```cpp int foo(int x) { return x & -x; } ``` - **解析**: - 函数`foo`接受一个整型参数`x`,返回`x`与它的补码相与(`x & -x`)的结果。 - 对于`foo(2^31-3)`,首先计算`2^31-3`。在32位系统中,`2^31`代表的是最大的负数(`-2147483648`),因此`2^31-3`实际上为`-2147483648 - 3 = -2147483651`。 - 在32位系统中,整数是以补码形式存储的,因此`-2147483651`的二进制表示中最低位为`1`,其余位为`0`。 - 因此,`x & -x`的结果就是最低位的`1`,即结果为`1`。 - **答案**:B: 1 ##### 题目2:程序输出什么? ```cpp unsigned char i = 0x80; printf("0x%x\n", ~i >> 3 + 1); // ~i >> 4 ``` - **解析**: - `~i`对`i`取按位非,由于`i`为`0x80`,即二进制`10000000`,取非后为`01111111`。 - `01111111`右移三位得到`00001111`,再加`1`变为`00010000`。 - 最终输出十六进制形式`0x10`,但是选项中没有这个值,根据提供的选项,最接近的是`0x1`。 - **答案**:D: 0x1 ##### 题目3:程序输出什么? ```cpp #include <iostream> using namespace std; class A { public: A() { cout << "A's Constructor Called" << endl; } }; class B { static A a; public: B() { cout << "B's Constructor Called" << endl; } }; int main() { B b; return 0; } ``` - **解析**: - `A`类有一个构造函数,会在对象创建时输出“A's Constructor Called”。 - `B`类同样有一个构造函数,会在对象创建时输出“B's Constructor Called”。 - `B`类中声明了一个静态成员`A a`,这意味着`A`的构造函数会被调用一次。 - 当创建`B`的对象`b`时,会再次输出“B's Constructor Called”。 - 因此,程序的输出是:“A's Constructor Called”和“B's Constructor Called”。 - **答案**:输出"A's Constructor Called"和"B's Constructor Called" ##### 题目4:程序输出什么? ```cpp union { int i; char x[2]; } a; int main() { a.x[0] = 10; a.x[1] = 1; printf("%d", a.i); return 0; } ``` - **解析**: - 使用`union`可以使得不同的数据类型共享同一段内存。 - 当将`10`赋值给`a.x[0]`,`1`赋值给`a.x[1]`时,`a.i`将被解释为这两个字符的组合。 - 字节顺序取决于编译器,通常情况下,小端序下输出为`10 * 256 + 1 = 2561`。 - **答案**:2561 ##### 题目5:程序输出什么? ```cpp class A { public: int m; void print() { cout << "A\n"; } }; int main() { A* pa = 0; pa->print(); } ``` - **解析**: - 创建了指向`A`类型的指针`pa`并将其初始化为`0`(空指针)。 - 调用`pa->print()`时,因为`pa`是空指针,所以会导致未定义行为,通常是运行时错误。 - **答案**:未定义行为,可能会导致程序崩溃。 ##### 题目6:程序输出什么? ```cpp char* c[] = {"ENTER", "NEW", "POINT", "FIRST"}; char** cp[] = {c + 3, c + 2, c + 1, c}; char*** cpp = cp; int main(void) { printf("%s", **++cpp); printf("%s", *--*++cpp + 3); printf("%s", *cpp[-2] + 3); printf("%s\n", cpp[-1][-1] + 1); return 0; } ``` - **解析**: - `cpp`是一个指向指向字符串的指针的指针。 - `**++cpp`表示先自增`cpp`,然后解引用两次,输出为“FIRST”。 - `*--*++cpp + 3`先自增`cpp`,然后解引用一次,再减去`cpp`,最后加上`3`输出为“W”。 - `*cpp[-2] + 3`表示向前移动两个位置并加上`3`,输出为“O”。 - `cpp[-1][-1] + 1`表示向前移动一个位置并访问最后一个元素,再加上`1`,输出为“S”。 - **答案**:输出为“FIRSTWOS”。 ##### 题目7:程序输出什么? ```cpp struct data { int a; unsigned short b; }; int main(void) { data mData; mData.b = 0x0102; char* pData = (char*)&mData; printf("%d%d", sizeof(pData), (int)(*(pData + 4))); return 0; } ``` - **解析**: - 结构体`data`包含一个`int`和一个`unsigned short`。 - 将`0x0102`赋值给`b`,即`01`在高位,`02`在低位。 - `sizeof(pData)`输出指针大小,通常为`4`。 - `*(pData + 4)`访问结构体中的`b`的高位部分,输出为`1`。 - **答案**:输出为`41`。 ##### 题目8:程序输出什么? ```cpp void chg_str(string& str) { str = "ichgit"; } int main() { string s = "sarrr"; chg_str(s); printf("%s\n", s.c_str()); cout << s << endl; return 0; } ``` - **解析**: - 函数`chg_str`接受一个引用参数`str`,并在函数内部改变其值。 - 在`main`函数中,传递`s`到`chg_str`,但忘记使用引用传递,因此`s`的值不会被改变。 - 输出`s`的原始值“sarrr”。 - **答案**:输出为“sarrr”。 ##### 题目9:程序输出什么? ```cpp int sum(int a) { int c = 0; static int b = 3; c++; b += 2; return (a + b + c); } int main() { int i; int a = 2; for (i = 0; i < 5; ++i) { printf("%d\n", sum(a)); } return 0; } ``` - **解析**: - `sum`函数中有局部变量`c`和静态变量`b`,`b`在每次函数调用之间保持值。 - 每次调用`sum`时,`c`都会增加`1`,`b`增加`2`。 - 第一次调用时,输出为`2 + 3 + 1 = 6`;之后每次调用,`b`和`c`的值分别增加`2`和`1`。 - **答案**:输出依次为`6`, `8`, `10`, `12`, `14`。 ##### 题目10:程序输出什么? ```cpp char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc"; cout << boolalpha << (str1 == str2) << endl; cout << boolalpha << (str3 == str4) << endl; cout << boolalpha << (str5 == str6) << endl; ``` - **解析**: - `str1`和`str2`是不同的字符数组,尽管它们包含相同的字符,但是地址不同。 - `str3`和`str4`也是不同的字符数组,尽管它们包含相同的字符,但是地址不同。 - `str5`和`str6`是指向相同字符串字面量的指针,它们的值相同。 - **答案**:输出依次为`false`, `false`, `true`。 #### 二、代码问题解析 ##### 题目11:以下代码有什么问题? ```cpp struct Test { Test(int) {} Test() {} void fun() {} }; void main(void) { Test a(1); a.fun(); Test b(); b.fun(); } ``` - **解析**: - `Test`类有两个构造函数,一个接受一个整数参数,另一个无参。 - `main`函数中创建`Test`对象时,使用`Test b();`语法试图创建对象`b`,这是错误的语法,应该使用`Test b;`。 - **问题**:语法错误,应改为`Test b;`。 ##### 题目12:以下代码有什么问题? ```cpp cout << (true ? 1 : "1") << endl; ``` - **解析**: - 使用条件操作符`? :`时,如果右边是字符串,则必须转换成数值类型才能与左边的整型进行比较。 - 此处直接使用字符串“1”作为条件表达式的右边值是不正确的。 - **问题**:类型不匹配,需要将字符串转为整型。 ##### 题目13:以下反向遍历`array`数组的方法有什么错误? ```cpp vector<int> array; array.push_back(1); array.push_back(2); array.push_back(3); for(vector<int>::iterator it = array.end(); it != array.begin(); --it) { // 处理元素 } ``` - **解析**: - `vector<int>::iterator`用于遍历`vector`容器。 - 反向遍历时,从`end()`开始递减直到`begin()`,但`end()`和`begin()`迭代器不能直接进行比较。 - 应该使用`--it`来确保`it`指向有效的元素,并且在循环条件中检查是否到达`rbegin()`。 - **问题**:循环条件错误,应改为`it != array.rbegin()`,并且在进入循环前执行`--it`。




























剩余8页未读,继续阅读


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


最新资源


