C语言深入学习--checklist4:宏、枚举、switch

2023-11-20

1.宏的本质是什么?函数?语句?类型定义?或者其它?

  预编译器的文本替换

1.  你知道语言设计者为什么设计宏吗?这些原因目前是否成立?

C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的 CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效 应。

2.  你会设计带参数的宏吗?

带参数的宏:

# define max(A,B) ((A)>(B)?(A):(B))

# define swap(x,y) {x = x + y; y = x - y; x = x - y;}

# define a(x) ((x>='A'&&x<='Z') ? (x+32) : x)

3.  你知道使用宏的参数的时候的注意事项?

如果表达式存在副作用(如含有自增运算符),则会出现不正确的情况。

如:max(i++,j++);

4.  设计带有可变参数的宏。

      暂时还没有总结

5.  宏的劣势

劣势:极容易出错,不进行类型检查

6.  宏的替代方案:使用C++内联函数进行替代。

内联函数的优势:

内联可调试;

可进行类型安全检查或自动类型转换

可访问成员变量。

函数内联如何工作:

对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错 误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数 都一样)。如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检 查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。

C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员。所以在C++ 程序中,应该用内联函数取代所有宏代码,断言assert”恐怕是唯一的例外。assert是仅在Debug版本起作用的宏,它用于检查不应该发生 的情况。为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。如果assert是函数,由于函数调用会引起内 存、代码的变动,那么将导致Debug版本与Release版本存在差异。所以assert不是函数,而是宏。)

 

 

枚举:

这篇博文将C中的枚举类型说的很详细:http://www.cnblogs.com/JCSU/articles/1299051.html

 

1.  是否可以指定枚举中的各项的值?

可以;

2.  如果不指定值,枚举值的第一个值是多少?

默认为0,其后的值在此基础上加1

3.  枚举的值是否可以为负数?

可以

4.       定义枚举的时候,你是否专门定义了枚举类型的最小值和最大值?

http://hi.baidu.com/%F4%95%D7%CE/blog/item/a6ece5098e7e8c1394ca6b7d.html

其实枚举类型是有上限和下限这样的取值范围的!!首先,要找出上限,需要知道枚举量的最大值,找到大于这个最大值的、最小值的2的幂,将它减去1,得到的便是取值范围的上限,例如定义语句如下:enum bigstep { first, second = 100, third };bigstep的最大值枚举值是101.2的幂中,比这个数大的最小值为128,因此取值范围的上限为127.要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限为0;否则,采用与寻找上限方式相同的方式,但加上负号。例如,如果最小枚举量为-6,而比它小的、最大的2的幂是-8(加上负员),因此下限为-7.

 

Switch

1.       Switch(c)中的c的数据类型有哪些?

c必须是一个常量整数值:故类型可以是char,int,long,short但不能是floatdouble有一道华为的面试题如下:

switch(c)中的c的数据类型不可以是charlongunsigneddouble中的哪种

答案显然是double

2   你是否在所有的switch语句中加上了default语句?

    是的。

3.  是否在所有的case语句中都加上了break语句?如果不加break语句,会发生什么?

    的,要加上break语句。如果不加上break语句,该逻辑之后的分支也得执行(但通常,程序的意图是不让他们执行。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言深入学习--checklist4:宏、枚举、switch 的相关文章

  • MSI 和 EXE 安装程序有什么区别,我应该选择哪一个? [复制]

    这个问题在这里已经有答案了 可能的重复 msi 和 setup exe 文件之间有什么具体区别 https stackoverflow com questions 1789530 what are the specific differen
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • gtest 和 gmock 有什么区别?

    我试图理解的目的google mock Google 的 C 模拟框架 https github com google googletest blob master googlemock README md 我已经与gtest较早 但我还是
  • C 中的复合语句表达式

    下面的代码不起作用 int i void 999 100 添加括号就可以了 为什么 int i void 999 100 还有另一种方法可以完成此类分配 int i void 999 100 是什么让他们与众不同 在这份声明中 int i
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 避免集合已修改错误

    Issue 我有以下代码 foreach var ItemA in GenericListInstanceB ItemA MethodThatCouldRemoveAnyItemInGenericListInstanceB 显然我得到一个错
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 获取给定EntityType的导航属性

    我在用VS2010 EF4 0 需要如下功能 private string GetNaviProps Type entityType eg typeof Employee NorthwindEntities en new Northwind
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs

随机推荐

  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • 前端多个参数传参js

    function getparm 返回当前 URL 的查询部分 问号 之后的部分 var urlParameters location search 声明并初始化接收请求参数的对象 var requestParameters new Obj
  • PPTP中的PAC 和PNS

    http blog csdn net galdys article details 6682298 网络服务器 PNS 访问集线器 PAC PAC 可编程自动化控制器 的概念是由ARC咨询集团的高级研究员Craig Resnick提出的 在
  • rostcm6情感分析案例分析_基于情感词典的情感分析方法

    上节课我们介绍了基于SnowNLP快速进行评论数据情感分析的方法 本节课老shi将介绍基于情感词典的分析方法 基于情感词典的分析方法是情感挖掘分析方法中的一种 其普遍做法是 首先对文本进行情感词匹配 然后汇总情感词进行评分 最后得到文本的情
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • Kali Linux进阶篇:Nmap扫描网络空间存活主机技巧

    课前声明 1 本分享仅做学习交流 请自觉遵守法律法规 2 搜索 Kali与编程 学习更多网络攻防干货 一 背景介绍 nmap是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作
  • Java对象的快速复制的几种方式

    浅拷贝 深度复制 BeanUtils copyProperties 对象的克隆是指创建一个新的对象 且新的对象的状态与原始对象的状态相同 当对克隆的新对象进行修改时 不会影响原始对象的状态 注释 clone 是object类的protect
  • Makefile中的include命令详解

    转载地址 点击打开链接 关于Makefile中的include命令 网上有很多介绍 比较普遍的说法是 Makefile中的include命令与C语言中的include命令类似 命令include file dep 即把file dep文件在
  • 最流行的五大数据模型工具

    当今的商业决策对基于天的数据依赖越来越强烈 然而 正确而连贯的数据流对商业用户做出快速 灵活的决策起到决定性的作用 建立正确的数据流和数据结构才能保证最好的结果 这个过程叫做数据建模 为了避免认为错误并且加快进度 我们需要使用专业的软件来帮
  • CUBLAS变量解释(1)

    变量类型 cublasOperation t 解释 该类型表明输入的密集矩阵的形式 其值有 CUBLAS OP N 非转置 CUBLAS OP T 转置 CUBLAS OP C 共轭转置 该函数对应于BLAS FORTRAN版 的变量字符
  • C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数

    include
  • 百度富文本编辑器UEditor配置及功能实现详解

    当前功能基于PHP 其它语言流程大抵相同 大概流程 1 将docx文件上传到服务器中 2 使用PHPoffice PHPword实现将word转换为HTML 3 将HTML代码返回并赋值到编辑器中 1 编辑器配置修改 1 1 新增上传wor
  • ubuntu下安装Navicat

    Step1 打开Navicat官网 下载Navicat 网址 http www navicat com en download download html Navicat for MySQL 10 0 11 Download Downloa
  • SQL中IN、NOT IN的使用,以及NULL值的比较

    SQL中IN以及NOT IN的使用 以及NULL值的比较 在LeetCode写 608 树节点 题时 发现使用NOT IN在比较值为空的列时存在问题 记录在此 IN 和 NOT IN 在SQL中是用来指定一个列应该与其匹配的值的列表 IN
  • 【论文阅读】learning with noisy correspondence for cross-modal matching ------ 跨模态匹配,噪声对应

    注意 本博客非逐字逐句翻译论文 是作者阅读论文后根据自己的理解所写 预知论文详情 请参阅论文原文 论文标题 Learning with Noisy Correspondence for Cross modal Matching 作者 Zhe
  • 信号与系统3——傅里叶描述

    信号与系统3 傅里叶描述 1 复正弦信号和线性时不变系统的频率相应 1 频率响应Frequency response 2 离散LTI系统的频率响应Frequency response of Discrete time LTI system
  • qml程序如何启动

    1 qml主界面是Window或者是ApplicationWindow 在main cpp中可以使用 QQmlApplicationEngine engine engine load main qml 2 qml中的主界面是Rectangl
  • MSP430F5529库函数——模数转换模块(ADC12)软件触发

    需提前观看 MSP430F5529库函数学习 串口 目录 代码 ADC初始化部分 引脚复位 ADC12 A init 函数声明 baseAddress sampleHoldSignalSourceSelect clockSourceSele
  • 一种简单的计算item相似度算法

    计算item之间相似度是个有意义的工作 比如词的相似度就有很多应用场景 词相似度就有很多做法 工业上现在用得最多的可能是word2vec了 还有些算语义相似度的偏学术的办法 这里介绍一种比较简单可行的思路 不只是算词相似度 其他类型也可以
  • C语言深入学习--checklist4:宏、枚举、switch

    宏 1 宏的本质是什么 函数 语句 类型定义 或者其它 预编译器的文本替换 1 你知道语言设计者为什么设计宏吗 这些原因目前是否成立 在 C程序中 可以用宏代码提高执行效率 宏代码本身不是函数 但使用起来象函数 预处理器用复制宏代码的方式代