Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C/C++ 基本类型注意事项

C/C++ 基本类型注意事项

作者头像
HeaiKun
发布于 2020-07-07 03:26:25
发布于 2020-07-07 03:26:25
48700
代码可运行
举报
文章被收录于专栏:HeaiKunHeaiKun
运行总次数:0
代码可运行

本文只会介绍C++ 学习时的一些细节,不会详细介绍C++的基础知识,如有需要学习基础知识的,请直接阅读《C++ Primer》一书。




1. C++ 中的基本类型

C++ 中的类型和C语言中的类型相似,有几个不常用的大家可以了解一下。

  • wchar_t:这是一个宽字符 它是 Unicode 字符的数据类型,长度是16bit 或则 32bit,GNU 库里面定义为32bit。
  • char16_t: 这是一个16位的 Unicode 字符类型。
  • char32_t: 这是一个32位的 Unicode 字符类型。
  • long double:扩展精度浮点数,长度和double一样都是64bit。

我们最常用的 int 类型和 CPU 的架构是关系的,在16位的单片机上编程时,要注意单片机上的 int 是16位的,PC上的int是32位的,如果有单片机与上位机交互的需求时,一定要注意数据类型大小不一致导致的BUG。

char 类型的数据 是不能确定它到底是有符号还是无符号的,char是有符号还是无符号取决于当前的编译器。当我们在使用char类型的时候,如果对其符号要求比较高时,尽量使用signed 或unsigned 指明它的符号类型。如果对符号类型没有要求,则可以直接使用char。

2. 变量

变量我们一定要搞清楚的是 声明、定义和初始化。变量可以声明多次但是只能定义一次。

  1. 声明是只规定了变量的类型和名称,但是没有申请内存空间。
  2. 定义不仅规定了变量的类型和名称,还创建了与变量名相关联的实体,也就是申请了对应类型大小的内存空间。
  3. 初始化就是在申请空间创建实体的时候,给其一个初始值。与赋值不同,赋值是将变量的当前值擦除,用一个新值代替。

变量在不同的位置进行定义,变量的作用范围和生命周期是不一样的,这就是变量的作用域。变量分为全局变量和局部变量。

  1. 全局变量:在任何花括号{}之外定义的变量就是全局变量,这样的变量在整个程序范围内都可以使用。生命周期也就是直到整个进程退出。
  2. 局部变量:局部变量也就是花括号{}里面定义的变量,一般是在函数体内定义的变量,它的生命周期也就是到函数执行完毕,变量的空间被释放。

当变量被static进行修饰的时候,变量的生命周期和全局变量一样了。static这里不详细的说了,想了解的可以网络搜索一下。一般面试有可能会被提问到static的作用。

3. 复合类型

复合类型指的是基于其他类型定义的类型。这里只说 指针和引用这两个,重点会说一说引用。

指针有点像Windows中的快捷方式,Linux系统中的软连接。指针本身是一个4Byte或者8Byte(看操作系统的位数)大小的变量,变量内容是另一个对象的地址,引用指针的地址,可以直接操作所指向的对象。

引用就像Linux系统中的硬连接。引用就是给对象另起一个名字而已,所以引用在声明的时候必须要初始化。

4. const 限定符

const 修饰的对象是不可修改的。默认情况下 const 对象只对文件内有效。

const和引用:对const的引用可能引用一个非const的 对象,这样不能使用该引用来修改对象的内容。

const和指针: 因为指针本身是一个对象,指针指向的也是一个对象,因此const指针本身和const指针指向的对象是两个独立的问题。这时候要考虑三种情况。

  1. 该指针对象是 const 类型,指针所指向的对象不是 const ,这时 该指针会一直指向一个对象不可修改,被指向的对象是可以修改的。
  2. 该指针对象不是 const 类型,指针所指向的对象是 const ,这时 该指针所指向的对象是不可以修改的,该指针可以修改指向其他的const对象。
  3. 该指针是const类型,指针所指向的对象也是const,这是 该指针将会一直指向一个不可修改的对象。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int *p;  //指针p 指向一个常量 但是指针p可以修改
int *const p;  //指针p 一直指向一个初始化的地址
const int *const p; //指针p一直指向一个常量的地址

类似于指针这样,我们使用 顶层const 表示指针本身是const常量,使用 底层const 表示指针指向的对象是一个const常量。

5. 处理类型

类型别名就是将一种类型另外再起一个名称。一般会使用 typedef 和 using ,使用#define进行类型别名引入问题太对,不推荐使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef unsigned int  U32;
using U32 = unsigned int;

类型指示符: auto 和 decltype

  1. 当我们无法确定一个变量到底应该使用什么类型的时候,可以使用auto,它会根据变量的初始值推算出变量的类型,所以auto类型的变量一定要有初始值。auto一般会忽略顶层const 保留 底层const。
  2. 当我们想使用某个表达式推算出变量的类型,但是又不想使用该表达式作为初始值,可以使用 decltype 它只返回表达式结果的类型,实际上并不会去执行这个表达式。

这里要注意的是 decltype 的表达式如果是一个指针的解引用,那么得到的将是一个引用类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
decltype(*p) 将得到一个引用类型

预告:C/C++系列的下期是 字符串与数组

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HeaiKun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文读懂SpringMVC中的数据绑定
Struts2 和 SpringMVC 都是 Web 开发中视图层的框架,两者都实现了数据的自动绑定,都不需要我们手动获取参数然后关联到对应的属性上,下面就谈谈两者的区别。
Wizey
2018/09/29
9420
Spring自定义参数解析器设计
我们在开发Controller接口时经常会用到此类参数注解,那这些注解的作用是什么?我们真的了解吗?
程序猿川子
2023/05/04
6460
spring mvc之HandlerMethodArgumentResolver
因为:1.加重了我们对请求传过来来的值的取值代码,会使控制器中request.getParamater()之类的代码越来越多;2.不利于测试;3.request.getParamater()只能获取string,如果是Long等其他类型的参数还需要强转,使用起来非常不方便。
BUG弄潮儿
2022/06/30
2710
SpringMVC 解毒3
第三章将 HandlerMapping的时候,我们看到抽象类 AbstractUrlHandlerMapping 中的映射的handler都是Object类型的,而抽象类 AbstractHandlerMethodMapping 的最终实现类的handler必须是方法,类必须有@Controller或@RequestMapping注解,对应的方法也得有@RequestMapping注解。
zhangheng
2020/04/28
4810
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】
在享受Spring MVC带给你便捷的时候,你是否曾经这样疑问过:Controller的handler方法参数能够自动完成参数封装(有时即使没有@PathVariable、@RequestParam、@RequestBody等注解都可),甚至在方法参数任意位置写HttpServletRequest、HttpSession、Writer…等类型的参数,它自动就有值了便可直接使用。 对此你是否想问一句:Spring MVC它是怎么办到的?那么本文就揭开它的神秘面纱,还你一片"清白"。
YourBatman
2019/09/03
2.5K2
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】
SpringMVC 九大组件之 HandlerAdapter 深入分析
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2021/04/02
5810
web九大组件之---RequestMappingHandlerAdapter详尽解析【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/10/22
4.2K0
web九大组件之---RequestMappingHandlerAdapter详尽解析【享学Spring MVC】
从原理层面掌握@InitBinder的使用【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/18
3.5K0
记一次springboot项目自定义HandlerMethodArgumentResolver不生效原因与解法
本文素材的来源自业务部门技术负责人一次代码走查引发的故事,技术负责人在某次走查成员的代码时,发现他们的业务控制层大量充斥着如下的代码
lyb-geek
2022/10/25
1.1K0
记一次springboot项目自定义HandlerMethodArgumentResolver不生效原因与解法
SpringMVC参数绑定-细致总结(通俗易懂)
前面已经写过 SSM 三大框架的一些入门文章,在 SpringMVC 部分,关于参数的绑定提的不是太多,重新整理了一下,就当做一个补充,时间匆匆,可能会有一些错误,大家可以共同交流,一起探讨!
BWH_Steven
2020/05/11
1.2K0
SpringMVC参数绑定-细致总结(通俗易懂)
深入分析Spring MVC中RequestBody与ResponseBody
  在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换。在Spring MVC内部是如何做到的呢?先记住下面这张图,然后对里面的每个对象进行分析:
良辰美景TT
2018/09/11
2.2K0
深入分析Spring MVC中RequestBody与ResponseBody
mvc配置指定参数处理
人原来是这样健忘的,同样的一个人在短短的时间内竟然变换了两个面目,过后他又想,大概正是因为这样健忘,所以才能够在痛苦中生活下去罢。——巴金 今天遇到这样一个情况,我想使用parameter也就是?
阿超
2022/08/17
3700
mvc配置指定参数处理
springMVC参数绑定
处理器形参中添加如下类型的参数处理注解适配器会默认识别并进行赋值。 1 HttpServletRequest 通过request对象获取请求信息 2 HttpServletResponse 通过response处理响应信息 3 HttpSession 通过session对象得到session中存放的对象 4 Model 通过model向页面传递数据,如下: //调用service查询商品信息 Items item = itemService.findItemById(id); model.addAttribute("item", item); 页面通过${item.XXXX}获取item对象的属性值。 model也可以通过modelMap或map将数据传到页面(这是因为底层就是这个类型,具体可以看看底层代码)。
intsmaze-刘洋
2018/08/29
6820
三歪肝出了期待已久的SpringMVC
本文公众号来源:Java3y 作者:三歪 本文已收录至我的GitHub/Gitee
Java3y
2020/05/25
5940
三歪肝出了期待已久的SpringMVC
自定义Controller方法参数解析器
这个接口中有两个方法,supportsParameter用于判断是否通过本解析器解析该参数,resolveArgument用于编写解析的逻辑,返回的对象赋值给方法的相对应的参数。
DH镔
2019/12/19
8780
HandlerMethodArgumentResolver(四):自定参数解析器处理特定应用场景,介绍PropertyNamingStrategy的使用【享学Spring MVC】
前面通过三篇文章介绍了HandlerMethodArgumentResolver这个参数解析器以及它的所有内置实现,相信看过的小伙伴对它的加载、初始化、处理原理等等已能够做到了心中有数了。 Spring MVC内置注册了灰常多的处理器给我们的使用,不客气说几乎100%的case我们都是足够用了的。但既然我们已经理解到了HandlerMethodArgumentResolver它深层的作用原理,那么本文就通过自定义参数处理器,来做到屏蔽(隔离)基础实现、更高效的编写业务编码(提效是本文的关注点)。
YourBatman
2019/09/03
11.7K1
HandlerMethodArgumentResolver(四):自定参数解析器处理特定应用场景,介绍PropertyNamingStrategy的使用【享学Spring MVC】
如何妙用Spring 数据绑定机制
在剖析完 Spring Boot 返回统一数据格式是怎样实现的?文章之后,一直觉得有必要说明一下 Spring's Data Binding Mechanism 「Spring 数据绑定机制」。
用户4172423
2019/12/25
1.2K0
如何妙用Spring 数据绑定机制
spring 之 spring-mvc
spring-mvc的核心便是DispatcherServlet,所以初始化也是围绕其展开的。类图:
MickyInvQ
2021/10/22
1.1K0
spring 之 spring-mvc
@RequestParam等参数绑定注解是怎么实现的?自定义参数绑定注解的妙用
SpringMVC参数绑定的注解有很多,如@RequestParam,@RequestBody,@PathVariable,@RequestHeader,@CookieValue等。这些注解的实现方式很类似,都是有一个对应的解析器,解析完返回一个对象,放在方法的参数上。对参数绑定注解不熟悉的看推荐阅读
Java识堂
2019/05/22
4.2K0
Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上
前面已经详细介绍过了RequestMappingHandlerMapping是如何在初始化方法中搜集容器中所有标注了@Controller或者@RequestMapping注解的Bean的,然后解析将映射关系保存到映射中心。
大忽悠爱学习
2023/02/13
8180
Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上
推荐阅读
相关推荐
一文读懂SpringMVC中的数据绑定
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验