当前位置: 首页 > news >正文

【C++ 面试 - 基础题】每日 3 题(八)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

22. def ine、const、typedef、inline

22.1 c onst 与 #define 的区别:

  1. const 定义的常量是变量带类型,而 #define 定义的只是个常数不带类型;

  2. define 只在预处理阶段起作用,简单的文本替换,而 const 在编译、链接过程中起作用;

  3. define 只是简单的字符串替换没有类型检查。而 const 是有数据类型的,是要进行判断的,可以避免一些低级错误;

  4. define 预处理后,占用代码段空间,const 占用数据段空间;

  5. const 不能重定义,而 define 可以通过 #undef 取消某个符号的定义,进行重定义;

  6. define 独特功能,比如可以用来防止文件重复引用。

 22.2 define 和 const 在内存里是怎么存的?

define 不分配内存,因为是在编译期前替换,const 是在编译时起作用。宏定义的数据没有分配空间,只是插入替换掉;const 定义的变量只是值不能改变,但要分配内存空间。

22.3 #d efine 和别名 typedef 的区别

  1. 执行时间不同,typedef 在编译阶段有效,typedef 有类型检查的功能;#define 是宏定义,发生在预处理阶段,不进行类型检查;

  2. 功能差异,typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等。#define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

  3. 作用域不同,#define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而 typedef 有自己的作用域。

 22.4 #define 与 inline 的区别

  1. #define 是关键字,inline 是函数;

  2. 宏定义在预处理阶段进行文本替换,inline 函数在编译阶段进行替换;

  3. inline 函数有类型检查,相比宏定义比较安全;

 22.5 inline 的作用

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 用关键字 inline 放在函数定义的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上 “内联地” 展开,假设我们将 max 定义为内联函数:

inline int max(int a, int b)
{return a > b ? a : b;
}

则调用:cout << max(a, b) << endl; 在编译时展开为:cout << (a > b ? a : b) << endl; 从而消除了把 max写成函数的额外执行开销。

22.6 用  define 实现 MAX 函数

#define MAX(a, b) ((a) > (b) ? (a) : (b))

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

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

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

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

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

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

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

24. st rlen 和 sizeof 的区别

  1. sizeof 是一个操作符,strlen 是库函数。

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

      strlen 是不将 \0 算进长度中,而 sizeof 会将 \0 算进长度。

      例如 "abcdef",strlen 会计算成 6 而 sizeof 会计算成 7。

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

  4. 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针。

      举个例子:  

  对于 64 位的机器来说,输出结果为:     为了避免转换成指针,我们可以以引用的方式传递:

  

  在这个例子中使用了模板函数 printsizeAndLength,它接受一个数组引用作为参数在函数内部,使用 sizeof 计算数组的大小时,数组不会退化为指针。

  引用的作用就在于阻止拷贝的发生,通过传递引用,我们让形参得到和数组名同样的地址。

 

http://www.lryc.cn/news/419176.html

相关文章:

  • 影响LabVIEW工作效率的因素有哪些
  • linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)
  • 性能测试工具LoadRunner
  • 智能归来:深入探索人工智能回归模型的奥秘
  • swift 中,对象() 和 对象.init() 的共同点和异同点
  • Google安装JSON-handle扩展
  • 剖析算法内部结构----------贪心算法
  • uni-app开发微信小程序注意事项,不要用element-ui
  • Hibernate的检索策略(lazy、fetch、batch-size)
  • 算法训练(leetcode)第四十六天 | 110. 字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长
  • 自定义Mybatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题)
  • 2024剪辑神器盘点:四大热门剪辑软件推荐!
  • sql注入靶场sqli-labs常见sql注入漏洞详解
  • [C++] 模板进阶:特化与编译链接全解析
  • oracle-备份
  • oracle 并行parallel的插入insert用法
  • 夜莺监控使用指南
  • MySQLDM笔记-查询库中是否存在列出的表名及查询库中列出的不存在的表名
  • 第9天 xxl-job
  • C++字符串<string>库
  • 智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用
  • 02 Canal的安装使用
  • 【网络安全】玲珑安全第四期
  • 【工具】图片背景移除界面 UI 源码
  • CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)
  • 假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?
  • flutter doctor出现 Unable to find bundled Java version
  • Linux系统修改root密码
  • AI时代,我们还可以做什么?
  • 【生成式人工智能-十-文字、图片、声音生成策略】