第二章 :变量和基本类型


2.1 基本内置类型

C++定义了一套包含算术类型(arithmetic type)空类型(void)在内的基本数据类型

2.1.1 算术类型

算术类型的分类:

整型(integral type,包含字符布尔类型)和浮点型

算术类型的尺寸:

不同的机器具有不一样的尺寸,但都遵循下表的规则



解析:

1.bool类型的取值为真(true)或假(flase)

2.char的空间应当保证能存放机器基本字符集中的任意字符对应的数字值

3.其他字符类型用于确保存放机器最大扩展字符集的任意一个字符,类型char16_t,char32_t则为Unicode字符集服务

4.整型用于表示(可能)不同尺寸的整数,C++语言规定int的大小至少大于short,以此类推。

PS:2中的机器基本字符集不一定是ASCII,该标准不保证基本字符集应为ASCII。实际上,其他字符集已经存在并且仍然存在于诸如EBCDIC之类的特定系统上

PS:类型long double用于有特殊浮点需求的硬件上,它具体实现的不同会导致精度的不同

带符号类型和无符号类型

除去布尔类型和扩展的字符类型外,其他整型可以划分为带符号(signed)无符号(unsigned)

1.以int为例,在int前加入unsigned形成unsigned int即可表示无符号整型,其他整型同理。

2.和整型不同,字符型被分为三种:char,signed char, unsigned char。

3.char和signed char与int和signed int不同,char为带符号还是无符号,是由编译器决定的

建议:如何选择类型

1.明确知道不为负数时,使用无符号类型

2.一般使用int,如果超过了int就使用long long,因为long 可能和int同大小

3.算术表达式中不要使用char和bool,char的符号不确定,容易造成不同机器上的错误

4.浮点数运算使用double,float的精度太低,能表达的范围太小

2.1.2 类型转换

在C+++中一种运算被大多数对象类型支持,就是将一种给定的类型转换(convert)为另外一种相关类型

实例

bool b = 42;//非0数字视均为true,所以b=1
int i = b;
i = 3.14;//会取小于输入值的最大整数
double pi = i;//pi=3.0
unsigned char c= -1;//即设char类型为8byte,那么c=255,是初始值对无符号类型表示数值总数取模后的余数
signed char c2 = 255;//当给带符号类型一个超出范围的数,结果将是未定义的

建议:避免无法预知或依赖于实现环境的行为

无法预知的行为源于编译器无须(有时是不能)检测的错误。

即使编译通过了,如果程序执行了一条未定义的表达式,仍然有可能出错。

程序也应该尽量避免依赖于实现环境的行为

如果把int的尺寸看为一个确认不变的已知值,那么这样的程序就称为不可移植(nonportable)的,当程序移植到其他机器时就很容易出错,并且不容易查找和修复。

含有无符号类型的表达式

尽管我们不会对无符号类型赋负值,但很容易就写出这种代码

实例
unsigned u=10;
int i =-42;
cout<<i+i<<endl;//正确
cout<<i+u<<endl;//果int占32位,输出值为4294967264

分析:

在i+u运算的过程中,会将i转化成无符号数进行运算。(推荐CSAPP作为这部分的参考书籍)

在两个无符号数相减时也会出现相同的问题

unsigned u1 = 42,u2 = 10;
cout<<u1-u2<<endl;//正确,输出32
cout<<u2-u1<<endl;//结果是取模之后的值

可能上述两个例子不能让你感受到对程序有多么大的影响,现在我们来看一个因为无符号类型而导致无限循环的例子

for(int i=10;i>=0;--i)
cout<<i<<endl;//正确

我们将i的类型换成无符号类型

for(int i=10;i<=0;--i)
cout<<i<<endl;//错误:变量u永远也不会小于0,循环条件一直成立

分析:

当u=0输出,这次迭代输出0,然后继续执行for语句中的自减,u=4294967295,形成一个死循环

提示:切勿混用带符号类型和无符号类型

2.1.3 字面值常量

int i = 42;

这个42,就是一种字面值常量。

每个字面值常量都对应一种数据类型,字面值常量的形式决定了它的数据类型

整型字面值

整型字面值可以写作十进制,八进制,十六进制的形式

PS:以0开头的整数代表八进制数,以0x开头的整数代表十六进制数

1.默认情况下,十进制的字面值时带符号数,类型是int,long,long long中尺寸最小的那个,但前提是这种类型要能容纳下当前的值

2.尽管整形字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数。(int i=-42,实际上是对字面值42进行了取负操作)

3.八进制十六进制字面值可能是带符号也可能是不带符号,类型规则同int,但会出现unsigned等的数据类型

4.如果一个字面值与之关联的最大数据类型都无法存放,那将产生错误。

5.类型short没有字面值类型,但可以使用后缀代表相应的字面值类型

浮点数字面值

浮点数字面值是一个double类型

指数的表示:

指数部分使用E或者e表示

3.14e1=31.4

字符和字符串字面值

单引号括起来的称为char型字面值,用双引号括起来的称为字符串型字面值

'a'//字符字面值
"Hello world!"//字符串型字面值

字符串字面值其实是有常量字符构成的数组(array),每个字符串末尾处都会加上一个空字符('\0'),所以导致数组长度增加一个

两个字符串位置相邻且仅由空格,缩进和换行符分隔,那么它们是一个字符串

//分行书写的字符串字面值
cout<<"an apple "
"a watermelon"<<endl

布尔字面值和指针字面值

trueflase都是布尔类型的字面值

nullptr是指针字面值

指定字面值的类型

通过添加前缀和后缀可以改变整型和浮点型和字符型的字面值默认类型

L'a'//wchar_t
u8"hi!"//uft-8字符串字面值
42ULL//unsigned long long
1E-3F//float //10-3.0
3.14159L//long double

建议:在使用l时采用大写L,以便和1进行区分

转义序列

有两种字符程序员不能直接使用:

1.不可打印(nonprintable)的字符,如退格或其他控制字符

2.C++中有特殊含义的字符,如单引号,双引号,文号,反斜线

这种时候就需要使用转义序列

C++规定的转义序列如下表

cout<<'\n';//转到下一行
cout<<"\tHi!\n";//输出一个制表符,输出“Hi”,转到下一行

泛化的转义序列

1.‘\x’后面紧跟一个或多个十六进制数字

2.‘\’后面紧跟1个,2个,3个八进制数字

3.数字部分表示的是字符对应的数值

cout<<"Hi \x4d0\115!\n";//输出Hi,MOM!,转到下一行
cout<<'/115';//输出M

注意

如果\后面的数字超过3个,如\1234,前三个数会和\形成转义序列,而4会成为一个单独的字符,但\x要用上后面跟着的所有数字,一般来说,超过8为的十六进制数字都是和指定字面值的类型中的某个前缀作为开头的扩展字符集一起使用的

C++primer第二章的更多相关文章

  1. C++PRIMER第二章前半部分答案

    C++PRIMER第二章前半部分答案 哈哈哈,为什么是前半部分呢,后半部分还在学习中,重新系统性的学习c++,共同进步嘛,不多说,跟我一起来看看吧,第三章开始才是新手收割的时候,慢慢来~~ 2.1&a ...

  2. C++ Primer : 第二章:变量和基本类型(1)

    变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...

  3. <<C++ Primer>> 第二章 变量和基本类型 术语表

    术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节    别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...

  4. C++Primer 第二章

    //1.程序尽量避免依赖于实现环境的行为.比如:如果将int的尺寸看成一个确定不变的已知值,那么这样的程序就称为不可移植的. typedef int int32; //使用类似的typedef,可以有 ...

  5. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

  6. C++ Primer 第二章 学习笔记

    在auto一个引用时,auto会忽略顶层const,而保存底层const decltype(sum()) x = i; // I的类型就是sum()返回值的类型

  7. c++primer 第二章编程练习答案

    2.7.1 #include<iostream> int main() { using namespace std; ]; ]; cout << "input nam ...

  8. C++ Primer 笔记 第二章

    C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字 ...

  9. C++primer拾遗(第二章:变量和基本类型)

    这是我对c++primer第二章的一个整理总结,算是比较适用于我自己吧,一小部分感觉不用提及的就省略了,只提了一下平时不注意,或者不好记住的内容. 排版太费劲了,直接放了图片格式.从自己的oneNot ...

随机推荐

  1. 夏日葵电商:连锁零售店小程序o2o系统解决方案

    公众平台"附近小程序"功能上线后,一个主体账号可以同时绑定N+个门店,这对连锁零售店铺来说是重磅福利呀,无论你是通过搜索还是线下扫码进入小程序,线上与线下都完全贯通了,线上多种入口 ...

  2. ios audio不能够正常播放

    ios中audio不能直接通过audio.play()播放,需要用户在click事件或者touch事件中执行audio.play()才能播放. ajax回调中audio.play()音乐不能正常播放. ...

  3. 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...

  4. Hadoop本地编写的jar包放到集群执行时报错处理

    错误描述: 020-03-24 22:45:23,204 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor ...

  5. python---插入排序的实现

    插入排序 思想 ​ 列表被分为有序区和无序区两个部分, 最初有序区只有一个元素, 每次从无序区选择一个元素, 插入到有序区的位置, 直到无序区变空 import random from cal_tim ...

  6. Java 在Word指定段落/文本位置插入分页符

    在Word插入分页符可以在指定段落后插入,也可以在特定文本位置处插入.本文,将以Java代码来操作以上两种文档分页需求.下面是详细方法及步骤. [程序环境] 在程序中导入jar,如下两种方法: 方法1 ...

  7. 学习day43

    开始学习html知识

  8. Java语言学习day29--8月04日

    今日内容介绍1.Object2.String3.StringBuilder ###01API概念 * A:API(Application Programming Interface) * 应用程序编程 ...

  9. Java语言学习day15--7月21日

    今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...

  10. Promise的then和catch如何影响状态的变化

    记住两句话: 1.then正常返回resolved,里面有报错返回reject 1 const p1 = Promise.resolve().then(()=>{ 2 console.log(1 ...