C语言面试必备:基础篇与代码解析

需积分: 10 1 下载量 151 浏览量 更新于2024-09-16 收藏 3KB TXT 举报
"经典C语言面试题,包括基础概念和代码分析" C语言是计算机科学的基础,对于面试者来说,掌握其核心概念和技术至关重要。以下是对标题和描述中提及的C语言面试题的详细解答。 一、基本概念 1. 局部变量可以与全局变量重名,但在同一作用域内,局部变量会覆盖全局变量。如果在局部作用域内访问同名全局变量,需要使用`extern`关键字。 2. 引用全局变量有两种方式:直接使用变量名(如果在同一个文件或已通过`extern`声明)或通过函数参数传递。 3. 全局变量可以定义在头文件中,但这样做可能导致命名冲突和多副本问题。推荐的做法是将全局变量声明为`extern`并仅在其中一个`.c`文件中定义。 4. `static`关键词使变量具有静态存储持续时间,常量`const`表示变量不可修改,`volatile`表示变量可能被外部因素改变,`register`尝试将变量存储在寄存器中,以提高访问速度。 5. 局部变量存在栈中,全局变量存在于数据段(BSS段或初始化数据段),动态申请的数据存在堆中。 6. 堆和栈的主要区别在于管理方式和生命周期。栈由编译器自动管理,分配和释放快速,而堆由程序员手动管理,分配和释放较慢,但能申请大块内存。 7. 预编译处理是在实际编译之前进行的,主要用于宏替换、头文件包含和条件编译等,以减少编译时间。当头文件频繁变动或项目包含大量宏定义时,预编译是必要的。 8. C语言中的`struct`是类型定义,定义结构体类型;C++中`struct`除了定义结构体外,还可以定义类,且默认成员是公有的。 9. `memset`用于设置内存区域的每个字节为指定的值,`memcpy`用于复制内存区域,`strcpy`用于复制字符串。`memset`和`memcpy`操作原始字节,`strcpy`处理字符字符串。 10. `assert()`用于调试,当其参数表达式为假时,它会输出错误信息并终止程序运行。 11. 比较语句示例: - `BOOL var = 0;`:`if (var == 0)` - `int var = 0;`:`if (var != 0)` - `float var = 0.0f;`:`if (var != 0.0f)` - 指针变量:`if (var != NULL)` 12. 10进制:1000000000000000对应0,1111111111111111对应-1(补码表示法) 13. 最有效率的方法是直接赋值:`int result = 2 * 8;` 14. 从左到右的运算顺序:`x = x + 1`,`x += 1`,`x++`,`++x`都效率相同,因为它们只涉及一次加法操作。 15. `!a && b++`:`!a`为真(因为5不等于0),短路逻辑运算符意味着`b++`不会执行,因此`a`和`b`的值不变,均为5和3。 二、看代码写运行结果 1. 代码输出: - `a`在`a++`后变为11,`++a`前为11,因此`c`也为11。 - `b`存储的是`a++`的旧值,即10。 - `d`的计算涉及到未定义行为,因为`a++`和`a`的组合是非确定性的。但一般情况下,`d`的值可能是111(11*10+11+1),具体取决于编译器如何处理。 2. 代码执行结果: - `sizeof(struct data)`计算结构体`data`的大小,加上`max`(DATE类型的联合体)的大小。假设`DATE`的大小为12字节,`struct data`的大小为12(DATE)+ 4(int)+ 8(double)= 24字节,所以输出结果是24 + 12 = 36。 3. 计算sizeof的值: - `sizeof(str)`:10个字符加上空字符,共11字节。 - `strlen(str)`:计算不包括空字符的字符数量,为5。 - `sizeof("abcdef")`:字符串常量是字符数组,包含6个字符加上空字符,共7字节。 - `sizeof("abcdef")`和`sizeof(char[10])`是不同的,前者在内存中是一个字节数组,后者是类型定义,长度为10字节。 总结,这些面试题涵盖了C语言的基础语法、内存管理、运算符优先级、类型系统、预编译、结构体和联合体等多个方面,旨在检验面试者对C语言的深入理解和实际应用能力。