前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/C++ 基本类型注意事项

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

作者头像
HeaiKun
发布2020-07-07 11:26:25
4780
发布2020-07-07 11:26:25
举报
文章被收录于专栏:HeaiKun

本文只会介绍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
复制
const int *p;  //指针p 指向一个常量 但是指针p可以修改
int *const p;  //指针p 一直指向一个初始化的地址
const int *const p; //指针p一直指向一个常量的地址

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

5. 处理类型

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

代码语言:javascript
复制
typedef unsigned int  U32;
using U32 = unsigned int;

类型指示符: auto 和 decltype

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

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

代码语言:javascript
复制
decltype(*p) 将得到一个引用类型

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档