C++primer第二章
第二章 :变量和基本类型
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
布尔字面值和指针字面值
true和flase都是布尔类型的字面值
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第二章的更多相关文章
- C++PRIMER第二章前半部分答案
C++PRIMER第二章前半部分答案 哈哈哈,为什么是前半部分呢,后半部分还在学习中,重新系统性的学习c++,共同进步嘛,不多说,跟我一起来看看吧,第三章开始才是新手收割的时候,慢慢来~~ 2.1&a ...
- C++ Primer : 第二章:变量和基本类型(1)
变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...
- <<C++ Primer>> 第二章 变量和基本类型 术语表
术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节 别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...
- C++Primer 第二章
//1.程序尽量避免依赖于实现环境的行为.比如:如果将int的尺寸看成一个确定不变的已知值,那么这样的程序就称为不可移植的. typedef int int32; //使用类似的typedef,可以有 ...
- C++ Primer 第二章 引用 指针 const限定符
1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...
- C++ Primer 第二章 学习笔记
在auto一个引用时,auto会忽略顶层const,而保存底层const decltype(sum()) x = i; // I的类型就是sum()返回值的类型
- c++primer 第二章编程练习答案
2.7.1 #include<iostream> int main() { using namespace std; ]; ]; cout << "input nam ...
- C++ Primer 笔记 第二章
C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字 ...
- C++primer拾遗(第二章:变量和基本类型)
这是我对c++primer第二章的一个整理总结,算是比较适用于我自己吧,一小部分感觉不用提及的就省略了,只提了一下平时不注意,或者不好记住的内容. 排版太费劲了,直接放了图片格式.从自己的oneNot ...
随机推荐
- 深入理解ES6之《ES7》
指数运算符 Math.pow是可以进行求幂运算的求幂运算符是两个星号 let result = 5 ** 2 console.log(result) //25 console.log(result = ...
- WebGL小姐姐教我学画画之起手式
初次接触WebGL,如有错误之处欢迎留言,共同学习进步. v WebGL的自画像 我,WebGL,全名Web Graphics Library,是为了让死宅程序猿们(摊手)能在浏览器上为所欲为的画女朋 ...
- npm权限不够(安装什么都报错)
问题 Windows下使用npm安装任何包都报错, Windows下使用npm显示权限不够 如图: 解决方法 1. 方法一 使用管理员权限打开 命令窗口, 治标不治本!!!!不推荐 ...
- Adobe Xd 练习
作业要求: 我的work: 下载练习: 2020_3/work.xd 参考教程: https://www.youtube.com/watch?v=dbpGJU4WL1U
- Java之JDBC详谈(数据库)
详细介绍了数据库的JDBC操作,并且整理了具体方法,有代码实现与详细注释.
- thymeleaf模板使用
使用模板页面,实现在同一个页面展现不同数据,controller实现页面跳转的时候就不在需要打开新页面
- 2022.02.27 CF811E Vladik and Entertaining Flags
2022.02.27 CF811E Vladik and Entertaining Flags https://www.luogu.com.cn/problem/CF811E Step 1 题意 在一 ...
- jsp第二周作业
1.p39 实验2 显示当前时间,并输出上午(0-12)好,下午好(13-17),晚上好(18-23) <%@ page language="java" import=&qu ...
- java第十二周作业
1.定义一个点类Point, 包含2个成员变量x.y分别表示x和y坐标,2个构造器Point()和Point( intx0,y0),以及一个movePoint (int dx,intdy)方法实现点的 ...
- javaScript深拷贝和浅拷贝简单梳理
在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值)和复杂类型(对象),同时它们各自的数据类型细分下又有好几种数据类型 基本数据类型 数字Number 字符串 ...
