C语言C++面试必看:变量声明与定义、条件编译及类型比较

需积分: 9 7 下载量 167 浏览量 更新于2024-07-15 1 收藏 1.53MB PDF 举报
"C语言和C++的面试题目集,包含常见问题及详细解答,适合嵌入式领域的面试准备。" 在C语言和C++的面试中,掌握基础概念和语法是非常重要的。以下是一些关键知识点: 1. 变量的声明与定义: - **声明**(Declaration):告诉编译器变量的名称和类型,但不分配存储空间。可以多次声明同一个变量,只要确保最终有一个定义。 - **定义**(Definition):为变量分配内存,并确定其类型。每个变量只能被定义一次。 例如: ```c extern int A; // 声明,告知A是一个已定义的外部变量 int main() { extern int A; // 又一次声明,但不是定义 dosth(); // 使用A,假设dosth()会访问到A } int A; // 定义,实际分配内存 ``` 2. 条件编译指令: - **#ifdef**、**#else**、**#endif** 和 **#ifndef** 是预处理器指令,用于根据宏定义选择性地编译代码块。 - **#ifdef** 和 **#ifndef** 检查宏是否定义,如果定义则编译其后的代码,否则跳过。 - **#else** 在前面的条件不满足时,编译其后的代码。 - 这些指令常用于条件编译,以适应不同平台、配置或调试需求,避免不必要的编译和运行开销。 例如: ```c #ifdef MATH #include "math.c" // 只有当MATH宏被定义时,才会包含math.c #endif #ifdef DEBUG printf("In debugging!"); // 调试模式下打印信息 #endif ``` 3. 常见类型与零值比较: - **int**:`if (n == 0)` 或 `if (n != 0)`,比较整数是否等于零。 - **bool**:`if (flag)` 表示flag为true,`if (!flag)` 表示flag为false。 - **float**:由于浮点数可能有微小误差,通常使用一个很小的阈值(如`const float EPSILON = 0.00001;`)来判断接近零的情况:`if ((x >= -EPSILON) && (x <= EPSILON))`。 - **指针**:`if (p == NULL)` 检查指针是否为空,`if (p != NULL)` 检查指针是否非空。 4. 结构体赋值: - C++允许直接结构体赋值,如 `struct S s1, s2; s1 = s2;`。 - C语言中,结构体不能直接赋值,但可以通过成员逐一赋值或者使用内存拷贝函数`memcpy()`。 5. 结构体的内存对齐和结构体的大小: - 结构体成员的内存位置会受到内存对齐规则的影响,可能导致结构体的大小大于各成员大小之和。 - 在C++中,可以使用`sizeof`运算符获取结构体占用的字节数。 这些是C语言和C++面试中经常遇到的基础知识点,理解并掌握它们对于通过面试和进行实际编程工作至关重要。深入学习和实践这些概念,能够帮助开发者更好地理解和编写高效的C/C++代码。