腾讯2013笔试题解析:C语言与类型转换

需积分: 14 2 下载量 70 浏览量 更新于2024-09-12 收藏 238KB PDF 举报
"该资源包含了腾讯公司在2013年招聘笔试题目及其对应的答案解析,主要涉及C/C++编程语言的基础知识,包括数据类型的转换、类型提升、比较操作以及函数调用等方面。" 在给定的笔试题中,第一部分讨论了在32位系统下,不同数据类型之间的转换和比较: 1. 当`signed char a = 0xe0;`(负数)被赋值给`unsigned int b`和`unsigned char c`时,问题在于如何理解这些类型的转换和比较。选项A(`a > 0 && c > 0`为真)是错误的,因为`a`是负数,而`c`在转换时不进行符号扩展,变成正数。选项B(`a == c`为真)同样错误,即使它们的二进制表示相同,但在进行比较时,`a`会被提升为整型并保持其负值,因此与正数`c`不相等。选项C(`b`的十六进制表示是`0xffffffe0`)是正确的,因为`signed char`转换为`unsigned int`时会进行符号扩展,填充最高位的1。最后,由于A、B错误,D(以上都不对)也错误。 这部分知识点强调了类型转换时的符号扩展、类型提升以及在比较操作中的行为,特别是不同数据类型间的隐式转换。 第二部分涉及C/C++的语法和函数调用: 1. 在分析的几个选项中,`int i;`、`char a[10;`(缺少分号)、`string f();`、`string g(string &str);`分别定义了一个整型变量、一个未完整声明的字符数组、一个返回`string`的函数以及接受`string`引用作为参数的函数。选项A(`if(!!i) { f(); }`)是正确的,因为逻辑非运算符`!!`会将`i`转换为布尔值,如果`i`非零则调用`f()`。选项C(`a = a + 1;`)是错误的,因为数组名是常量,不能被赋值。选项D(`g("abc");`)基本肯定是错误的,因为`g`函数期望一个`string`引用,而`"abc"`是字符数组的字面量,不能直接传递给非`const`引用。对于选项B(`g(f());`),由于`f()`返回的是一个临时`string`对象,而`g`的参数是`string`的非`const`引用,因此不能直接传递,因为临时对象不能被非`const`引用引用,即使编译器可能允许生成警告,但不应视为正确选择。 这些题目反映了对C/C++基础语法、类型系统和函数调用的理解,特别是对临时对象、引用和类型安全性的深入掌握。解答这些问题需要对语言规范有清晰的认识,并理解编译器在处理不同类型和表达式时的行为。