- 本系列文章由 Nick-Pem 原创编写,转载请说明出处。
- 作者:Nick-Pem 邮箱:nickpem@163.com
关于变量跟基本类型,市面上各类编程书籍已经说的很详细了。像变量的类型,各种类型的取值范围,常量等等。如果您已经学习过C语言,并且已经基本掌握这些数据类型的用法,那么就很适合阅读《C++ Primer》这本书来学习C++这么语言。不过在此之前,还是建议先看看一些简单的C++教程书籍,再来啃这本书,或许会容易一点。
好的,咱们闲话少说,进入正题。
(一)数据的基本类型
一般分为以下几种:
- 布尔类型:bool
- 字符类型:char
- 整数类型:int,short,long,long long
- 浮点类型:float,double
还有一些其他类型,比如wchat_t,long double等等,因为使用频率不高,在此不提及。(补充:char32_t为Unicode字符集服务,如需了解,可参考P32)
关于这些类型的字长,含义等基础定义,默认读者已经学习过C语言关于此类的章节,也在此不再赘述。
(二)关于带符号与无符号类型
除去bool类型和扩展的char字符类型之外,其他整型可分为带符号和无符号:
- int,short,long,long long
- char
以上两种都分为带符号和无符号,有无符号最大的区别就是:
- 带符号能够取正数,负数,0
- 无符号仅能取正数,0(表达形式为:unsigned xxx)
在这里提供了两个可以学习的点:
- unsigned int,也可缩写为 unsigned 代表 无符号int
- char,signed char,unsigned char,在这里注意:char跟signed char并不一样。char会随机变为上述两种情况之一,具体由编译器决定。
关于取值范围等基础问题,读者可从《计算机组成原理》等课程中了解更多详情。原反补码在此文章中也就不提及。
(三)如何选择类型【重点】
- 当数值绝对不会为负,请选用:无符号类型(unsigned)
- 整数运算时,请选用:int;如果需要长的数据,请选用:long long
- 浮点运算时,请选用:double
- 算术表达式中,请不要使用char或bool。只有在存放字符或者布尔值的时候选用。
(四)类型的转换
关于取值范围等基础问题,读者可从《计算机组成原理》等课程中了解更多详情。原反补码在此文章中也就不提及。
主要记得以下几个关键的类型转换出现的情况:
- 非bool 传给 bool :0为false,否则为true
- bool 传给 非bool :false为0,true为1
- 浮点 传给 整型 :保留小数点前的数值(注意精度损失)
- 整型 传给 浮点 :小数点部分加0(注意精度损失)
- 给 unsigned 赋超出范围的值:初始值+模得出来的余数(计算机组成原理中有这一部分知识,下面也会着重讲解)
- 给 有符号 赋超出范围的值:结果是未定义的,造成的后果不可预计!!
这边给出一个很容易出错的,关于有无符号类型的代码:
for (int i = 10; i >= 0; i--) { std::cout << "i=" << i << std::endl; } for (unsigned j = 10; j >= 0; j--) { std::cout << "j=" << j << std::endl; }
第一段代码很清楚的想表达:把 i从10到0依次输出 ,结果很明显:
但是第二段代码问题就很大了,这段代码本意也是依次输出,但是由于采用了无符号类型,出现了以下的问题:
为什么会这样呢?具体原因还是出在,当最后一轮,i--得到的是-1,而j--因为是无符号类型,得到的是一个模,也就是4294967295,这个导致第二段代码只能陷入无限循环当中!
所以切记,一定要慎用无符号类型!!
关于如何改进,《C++ Primer》采用的是while提前减去值进行修改,而笔者依旧使用for改进了一下:
for (unsigned j = 5; j >= 0; j--) { if (j > 5) break; std::cout << "j=" << j << std::endl; }
(五)字面值常量
留坑,再填