华为面试技巧:全局与局部变量、static的深度解析

需积分: 10 3 下载量 151 浏览量 更新于2024-07-24 收藏 211KB DOC 举报
"华为技术面试题" 在华为的面试中,技术方面的问题涵盖了许多编程基础知识,包括变量的作用域、引用全局变量的方式、全局变量在多文件中的使用,以及静态变量和普通变量的区别。以下是这些知识点的详细解释: 1. 局部变量与全局变量重名: 在函数内部定义的变量称为局部变量,它只在该函数的作用域内有效。如果全局变量和局部变量同名,那么在函数内部,局部变量会遮蔽全局变量。要访问全局变量,需要使用作用域解析运算符 "::"。 2. 引用全局变量的方法: 要引用已定义的全局变量,通常有两种方式。一是通过包含包含该全局变量声明的头文件,这样在编译时会进行链接;二是使用 `extern` 关键字声明全局变量,这种方式在编译时不进行链接,而是在链接阶段寻找全局变量的定义。如果使用 `extern` 错误地引用了一个未定义的变量,编译期间不会报错,但链接时会出错。 3. 全局变量在头文件中的使用: 全局变量可以在头文件中定义,并在多个 `.C` 文件中被包含。但是,为了防止命名冲突,可以使用 `static` 关键字声明全局变量,使其在每个包含该头文件的 `.C` 文件中都是独立的,即每个 `.C` 文件都有一个独立的同名全局变量实例。 4. 代码输出分析: 下面的代码展示了预自增和自增操作的差异: ```c int main(void) { int a, b, c, d; a = 10; b = a++; // 先赋值,后自增,b = 10 c = ++a; // 先自增,后赋值,c = 11 d = 10 * a++; // 先计算表达式(d = 10 * 11),后自增,d = 110 printf("b,c,d:%d,%d,%d", b, c, d); return 0; } ``` 代码的输出是:`b,c,d:10,11,110` 5. 静态变量与普通变量的区别: - **静态全局变量**:与普通全局变量相比,它们的作用域仅限于定义它们的源文件内。这意味着其他源文件无法访问这些静态全局变量,减少了命名冲突的风险。 - **静态局部变量**:与普通局部变量相比,它们的生命周期贯穿整个程序运行期间,而不是只在函数调用时存在。每次函数调用时,静态局部变量保留其上次调用结束时的值。这意味着它们在函数多次调用之间保持状态。 - **静态函数**:静态函数的链接特性与静态全局变量类似,它们仅在定义的源文件内可见,不能被其他源文件直接调用。这增加了代码的封装性,避免了函数名的冲突。 理解这些基本概念对程序员,尤其是面试者来说至关重要,因为它们是任何编程语言的基础,也是编写可靠、高效代码的关键。在面试中,能够清晰地解释这些概念并应用到实际问题中,将有助于展示你的技术水平和解决问题的能力。