C++入门第三章:处理数据

面向对象编程(OOP)的本质是设计并扩展自己的数据类型。

内置的C++数据类型分为基本类型和复合类型。

基本类型分为整数和浮点数。

复合类型分为数组、字符串、指针和结构。

C++通过使用变量来存储数据。

  1. 简单变量

为把信息存储在计算机中,程序必须记录三个基本属性:

  • 信息将存储在哪里
  • 要存储什么值
  • 存储何种类型的信息

1 变量名

C++提倡使用一种有含义的变量名。在命名变量时必须遵守以下规则:

  • 在名称中只能使用字母字符、数字和下划线。
  • 名称的第一个字符不能是数字。
  • 区分大写字母和小写字母。
  • 不能将C++关键字作为名称。
  • 以两个下划线和下划线和大写字母大头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
  • C++对名称的长度没有限制,名称中所有的字符都有意义,但有些平台长度有限制。

最后一点和C99标准中有所不同,C99标准只保证名称的前63个字符有意义。

2 整型

整型有short、int、long、long long四种类型。

注:VC++6.0不支持long long型

  • short至少16位;
  • int至少与short一样;
  • long至少32位,且至少与int一样长;
  • long long 至少64位,且至少与long一样长。

不同的操作系统int的长度是不同的。

要知道系统中整型的最大长度,可以在程序中使用C++工具进行检查,sizeof可以实现该功能,sizeof返回到的是类型或变量的(字节)长度。

Climits(老式:limits.h)包含了关于整型限制的信息。

climits中的符号变量:

符号常量

表示

CHAR_BIT

char的位数

CHAR_MAX

char的最大值

CHAR_MIN

char的最小值

1)变量的初始化:

C++11中变量的初始化方式(可用于数组和结构,C98中也可用于单值变量):

int ham={24};

或者可以是:

int emus{7}

或者也可以是:

int roc={}; //roc=0

2)无符号整数

unsigned int、unsigned short、unsigned long、unsigned long long。

先说明变量数值越界的问题:

例:

exceed.cpp

//测试有符号整数和无符号整数越界(上溢或下溢)时的情况。

#include<iostream>

using namespace std;

int main(void)

{

short a; //a为有符号整数

unsigned b; //b为无符号整数

a=0;b=0;

cout<<"a为有符号整数,b为无符号整数。"<<endl;

cout<<"本操作系统中无符号整数最大为:"<<USHRT_MAX<<endl;

cout<<"a=0,b=0"<<endl;

a=a-1;

b=b-1;

cout<<"a-1为:"<<a<<endl;

cout<<"b-1为:"<<b<<endl;

a=SHRT_MAX; //a为有符号整数的最大值

b=a;

cout<<"a为有符号整数,b为无符号整数。"<<endl;

cout<<"本操作系统有符号整数最大为:"<<SHRT_MAX<<endl;

cout<<"a= SHRT_MAX,b= SHRT_MAX"<<endl;

a=a+1;

b=b+1;

cout<<"a+1为:"<<a<<endl;

cout<<"b+1为:"<<b<<endl;

return 0;

}

在windows7SP1的32位系统中使用VC++6.0运行得到的结果如下:

注:C++确保了无符号类型的这种行为,但C++并不保证符号整型超越限制的不出错。

3)选择整型类型

C++中提供了大量的整型。如没特殊情况,应选择int型,使用此类型时计算机的处理效率最高。

若变量的值为非负,则可采用无符号型。

若变量的最大可能值超过16wei位,使用long,若超过20亿,使用long long。

若使用大型数组且存储的值小于16位,使用short。

4)整型字面值

C++支持三种计数方式:十进制(decimal)、八进制(octal)、十六进制(hexadecimal)。

  • 第一位为1~9,为十进制。
  • 第一位为0,第二位为1~7,为八进制。
  • 前两位为0x或0X,为十六进制。

另外,cout定义了控制符dec、hex、oct来指示cout以十进制、十六进制和八进制格式显示整数。

例:displaydechexoct.cpp

//使用cout控制符显示整数的十进制、十六进制和八进制形式。

#include<iostream>

using namespace std;

int main(void)

{

int a=42; //定义十进制的a

cout<<"使用不同的形式表示整数。"<<endl;

cout<<dec; //设定以十进制形式显示整数

cout<<"a="<<a<<"(十进制形式)"<<endl;

cout<<hex; //设定以十六进制形式显示整数

cout<<"a="<<a<<"(十六进制形式)"<<endl;

cout<<oct; //设定以八进制形式显示整数

cout<<"a="<<a<<"(八进制形式)"<<endl;

return 0;

}

5) C++确定常量类型的方法

在int为16位,long为32位的系统上,20000为int型,40000为long型,3000000000为long long型。

通过后缀也可确定常量的类型,l,L代表long型;ll,LL代表long long型;还有ull,ULL,ul,lu,LU,UL等。通常使用大写,以免l和1混淆。

6)char类型:字符和小整数

char是专为存储字符而设计的。char是另一种整型。他足够长,能够表示计算机系统中所有的基本符号。

在美国,最常用的字符集是ASCII字符集。

C++使用的是其主机系统的编码——例如IBM大型机使用EBCDIC编码。

C++支持的宽字符类型可以存储更多的值,如国际Unicode字符集使用的值。

  • 成员函数cout.put()

函数cout.put()是一个重要的C++OOP概念——成员函数的一个例子。

类定义了如何表示和控制数据。成员函数归类所有,描述了操纵类数据的方法。

比如说类ostream有一个put()成员函数用来输出字符。只能通过类的特定对象(比如cout对象)来使用成员函数。要通过对象来使用成员函数必须通过句点(.)将对象名和函数名称(put())连接起来。句点被称为成员运算符。cout.put()表示通过类对象cout来使用函数put()。

  • char字面值(转义字符)

每个字符有对应一个ASCII值。

有些字符不能很直接通过键盘输入到程序中。例如回车。同时双引号不能包含在字符串中。为此,C++提供了一种特殊的表示方法——转义序列。

下表中列出了一些转义序列的编码:

字符名称

ASCII符号

C++代码

十进制数

换行符

NL(LF)

\n

10

水平制表符

HT

\t

9

垂直制表符

VT

\v

11

退格

BS

\b

8

回车

CR

\r

13

振铃

BEL

\a

7

反斜杠

\

\\

92

问号

?

\?

63.

单引号

'

\'

39

双引号

"

\"

34

例:

escapecharacter.cpp

//使用转义字符

#include<iostream>

using namespace std;

int main(void)

{

long passwords1,passwords2;

cout<<"测试密码程序。"<<endl;

cout<<"请输入密码:________\b\b\b\b\b\b\b\b"<<endl; //使用转义字符

cin>>passwords1;

cout<<"请再次输入密码:________\b\b\b\b\b\b\b\b"<<endl; //使用转义字符

cin>>passwords2;

if (passwords1==passwords2)

cout<<"输入一致。"<<endl;

else

cout<<"输入不一致!!"<<endl;

return 0;

}

通用字符名

C++使用通用字符名表示特殊字符。用法类似转义字符。

通用字符名使用\u和\U打头。其中\u后接8个十六进制位,\U后接16个十六进制位。这些为表示的是ISO 10646码点。

如果若用的实现支持扩展字符,则可在标识符和字符串中使用通用字符名。

例:

int k\u00F6rper;

cout<<"Let them eat g\u00E2teau.\n";

注:VC++6.0不支持扩展字符。

  • signed char 和unsigned char

在默认情况下,char既不是有符号的,又不是无符号的。

但如果将char作为数值型来看待,signed char 和unsigned char的差异就很重要了。signed char表示的范围为-128~127,unsigned char 表示0~255;

  • wchar_t为宽字符类型
  • bool类型

C++新标准中加入了bool类型。他有两个预定义字面值:true和false

例:bool is_ready=true

bool可转化成整型,true=1,false=0。

反过来,整型也可以转化成bool型,非零:true,零:false。

注:VC++6.0不支持bool型。

2 const限定符

C++处理符号常量的办法:使用const定义。

例:const int Month=12;

const可以定义整型和浮点型等多种数据类型的符号常量。

这样就可以在程序中使用常量Month了。

常量如果被初始化后,其值是固定的,是无法修改的,若未给其赋值,则其值是位置的也是不可改变的。

常量的标记方法:

  • 首字母大写:Month
  • 以k打头:kmonth
  • 其他……

3 浮点数

C++第二种基本数据类型:浮点数。浮点数能够用来表示带小数部分的数字。

计算机分两部分来存储浮点数。一部分用来表示值,一部分进行方法和缩小。如:34.1=0.341*100;真正的存储是以二进制进行缩放的。

  • 浮点数的书写

浮点数的书写有两种格式。

第一种为常用的标准小数法:

12.34、-1010.121、-0.0000001;

第二种为E表示法:

2.14e+12、5.12E-12;

e和E均为可选的。

  • 浮点类型

C++有三种浮点类型:float、double、long double。

有效位数的要求:float至少32位。double至少48位,且不少于float。这三种类型的有效位数可以一样多。

通常时,float为32位,double为64位,long double为80、96或128位。另外,这3种类型的指数范围至少是-37到37。

注:cout显示时会删除结尾的0显示。

浮点常量

后缀加f或F。

默认是double型。

4 C++算数运算符

C++提供了五种基本算数计算:加法、减法、乘法、除法和求模。每种计算均有两个操作数。

注:如果除法的两个操作数均为整数,则为整除。

求模的两个操作数必须均为整数,否则会报错。

类型转换

C++自动进行的类型转换:

  • 将一种算术类型的值付给另一种算数类型的变量时,C++将对值进行转换。
  • 表达式中包含不同的类型时,C++将对值进行转化。
  • 表达式中包含不同的类型时,C++将对值进行转化。
  • 将参数传递给函数时,C++将对值进行转换。

数值转换可能出现的问题:

转换

问题

较大浮点类型转化成较小的浮点类型,double变成float

有效位数降低,值会超出目标类型的取值范围,则值是未知的。

浮点型转化成整型

小数部分丢失,原来的值超出目标值的取值范围,结果不确定。

较大整型转化成较小整型

通常会超过目标类型的取值范围,只复制右边的类型。

使用{}的初始化时的转换(C++11)

它对类型的转化比较严格,不允许缩窄。即不允许变量的类型无法表示赋给它的值。

表达式中的转换

自动转化:在计算表达式时,C++将bool,char,unsigned char,signed char,short转化为int。此过程也被称为整型提升。

例:

short a=1;

short b=2;

short c=a+b;

计算过程:程序取得a,b的值后,将他们转化成int型,最后再将结果转化成short型。

C++表达式中的转化通过查阅校验表进行修改。

C++11的校验表如下:

  • 如果有一个操作数的类型是long double,则另一个操作数转化成long double。
  • 如果有一个操作数的类型是double,则另一个操作数转化成double。
  • 如果有一个操作数的类型是float,则另一个操作数转化成float。
  • 若操作数均为整数,进行整形提升。
  • 在这种的情况下,两个操作数均为有符号的或者是无符号的,且其中一个比另一个低,则转化为级别高的。
  • 如果一个操作数有符号的,另一个操作数是无符号的,无符号的操作数级别比有符号的高,则有符号的操作数转化成无符号的操作数所属的类型。
  • 否则,有符号类型能够表示无符号类型的所有可能取值,则将无符号操作数转化成有符号操作数所属的类型。
  • 否则,将两个操作数都转化成有符号类型的无符号版本。

整型级别:

从高到低:long long、long、int、short和signed char。

char、int、short和signed char等级相同。

强制类型转换

两种方式:

(typename) value;

typename (value);

第一种为C语言,第二种为C++。

C++ Primer Plus学习:第三章的更多相关文章

  1. C Primer Plus 学习 第三章

    这里只记录我自己以前不懂得地方,明白的地方就略过了 位  字节  字 位    0,1 字节  8位  也就有8位0,1的组合   2的8次方的组合 字      设计计算机时给定的自然存储单元.8位 ...

  2. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  3. Struts2框架学习第三章——Struts2基础

    本章要点 —  Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 —  WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...

  4. C#高级编程 (第六版) 学习 第三章:对象和类型

    第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上   2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件   函数成员 方法:与某个类相关的函数,可以 ...

  5. C语言学习第三章

    写在课前,提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号! 今天主要学习掌握if...else条件结构,多重if条件 ...

  6. C++PRIMER 阅读笔记 第三章

    本章主要介绍 string vector 和 bitset, 不能贪多,现在本文主要介绍 string 与 vector 头文件中最好不要使用namespace std, 因为头文件会直接被预处理器放 ...

  7. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...

  8. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-2-autograd

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 torch.autograd就是为了方 ...

  9. C++ Primer Plus学习:第九章

    C++第九章:内存模型与名称空间 C++在内存中存储数据方面提供了多种选择.可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等. 单独编译 程序分为三个部分: ...

  10. C++ Primer Plus学习:第二章

    C++入门第二章:开始学习C++ 进入C++ 首先,以下是一个C++程序: //myfirst.cpp 显示一行文字 #include<iostream> //预处理器编译指令 int m ...

随机推荐

  1. nginx 源码安装以及后续升级https

    事情的来源是,公司要将网站从http升级到https,由于历史遗留原因,才发现现有的nginx是通过源码安装的,并没有安装ssl模块,需要现安装sll模块,这个nginx是整个公司最前端的一个代理,涉 ...

  2. jquery.ajax的方法使用

    $.ajax({ type: 'post', url:"{:U('Admin/Shop')}", data:{id:id}, dataType: "json", ...

  3. tp5 接入腾讯对象存储COS

    以前写过一个接入阿里的OSS对象存储的,现在又简单写了个 腾讯COS对象存储. 这里只有COS使用方式,如果对接TP上传 可以去参考 :http://www.cnblogs.com/inkwhite/ ...

  4. 大数据学习系列之—HBASE

    hadoop生态系统 zookeeper负责协调 hbase必须依赖zookeeper flume 日志工具 sqoop 负责 hdfs dbms 数据转换 数据到关系型数据库转换 大数据学习群119 ...

  5. 20155229--Java实验四《Android开发基础》

    20155229 Java实验四<Android开发基础> 实验内容: 任务一: Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(E ...

  6. echarts 去掉最外部边框

    在option中,插入一下代码即可: grid: {show:'true',borderWidth:'0'}, 插入代码前: 插入代码后:

  7. css实现div两列布局——左侧宽度固定,右侧宽度自适应(两种方法)

    原文:css实现div两列布局--左侧宽度固定,右侧宽度自适应(两种方法) 1.应用场景 左侧一个导航栏宽度固定,右侧内容根据用户浏览器窗口宽度进行自适应 2.思路 首先把这个问题分步解决,需要攻克以 ...

  8. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

  9. resultMap中的collection集合出现只能读取一条数据的解决方法

    查询数据时只能获得collection集合中的的一条数据,相关情况如下: 结果集resultMap: <resultMap id="ManagerRolesAcls" typ ...

  10. LVS入门篇(四)之LVS实战

    一.LVS的NAT模式实战 1.环境说明: HOST OS role remask 192.168.56.12 Centos 7.4 LVS调度器(1.2.7) VIP:192.168.0.104 1 ...