【C++ Primer 笔记】(一) 基本内置类型

 

  • 本系列文章由 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;
    }

 

(五)字面值常量

留坑,再填

转载于:https://www.cnblogs.com/nickpem/p/8524533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值