面试准备每日五题:C++——变量定义&声明、#ifdef & #else、结构体赋值、sizeof & strlen、C和C++的static

文章目录

1 变量的声明和定义有什么区别?

为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

2 简述#ifdef、#else、#endif和#ifndef的作用

利用#ifdef#endif将某程序功能模块包括进去,以向特定用户提供该功能。在不需要时用户可轻易将其屏蔽;

#ifdef MATH
#include "math.c"
#endif

在子程序前加上标记,以便于追踪和调试;

#ifdef DEBUG
printf ("Indebugging......!");
#endif

应对硬件的限制。由于一些具体应用环境的硬件不一样,限于条件,本地缺乏这种设备,只能绕过硬件,直
接写出预期结果。

注 意 : 虽 然 不 用 条 件 编 译 命 令 而 直 接 用 i f 语 句 也 能 达 到 要 求 , 但 那 样 做 目 标 程 序 长 ( 因 为 所 有 语 句 都 编 译 ) , 运 行 时 间 长 ( 因 为 在 程 序 运 行 时 间 对 i f 语 句 进 行 测 试 ) 。而 采 用 条 件 编 译 , 可 以 减 少 被 编 译 的 语 句 , 从 而 减 少 目 标 程 序 的 长 度 , 减 少 运 行 时 间 。

3 结构体可以直接赋值吗?

声 明 时 可 以 直 接 初 始 化 , 同 一 结 构 体 的 不 同 对 象 之 间 也 可 以 直 接 赋 值 , 但 是 当 结 构 体 中 含 有 指 针 “ 成 员 ” 时 一 定 要 小 心,因为赋值时,赋值的是指针地址,当一个修改时,另一个也被修改了!

注 意 : 当 有 多 个 指 针 指 向 同 一 段 内 存 时 , 某 个 指 针 释 放 这 段 内 存 可 能 会 导 致 其 他 指 针 的 非 法 操 作 。 因 此 在 释 放 前 一 定 要 确 保 其 他 指 针 不 再 使 用 这 段 内 存 空 间 !

4 sizeof 和strlen 的区别

sizeof是一个操作符,strlen是库函数;

sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0’的字符串作参数;

编译器在编译时就计算出了sizeof的结果sizeof是关键字!而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度;

数组做sizeof的参数不退化,传递给strlen就退化为指针了;

5 C 语言的关键字 static 和 C++ 的关键字 static 有什么区别

在 C 中 s t a t i c 用 来 修 饰 局 部 静 态 变 量 和 外 部 静 态 变 量 、 函 数 。 而 C + + 中 除 了 上 述 功 能 外 , 还 用 来 定 义 类 的 成 员 变 量 和 函 数 。 即 静 态 成 员 和 静 态 成 员 函 数 。

注 意 : 编 程 时 s t a t i c 的 记 忆 性 , 和 全 局 性 的 特 点 可 以 让 在 不 同 时 期 调 用 的 函 数 进 行 通 信 , 传 递 信 息 , 而 C + + 的 静 态 成 员 则 可 以 在 多 个 对 象 实 例 间 进 行 通 信 , 传 递 信 息 !

上一篇:Enterprise Architect 15 使用指南 II


下一篇:《QDebug 2021年3月》