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. PL/SQL报错:ORA-28000:the account is locked

    第一种方法(图形操作):第一步:使用PL/SQL,登录名为system,选择类型的时候把Normal修改为SYSDBA:第二步:选择users下的system,右击点击“编辑”: 第三步:修改密码,把 ...

  2. Java操作Redis(一)

    一.创建项目,导入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis& ...

  3. vue中组件间的传参

    1.父传子 父组件准备一个数据,通过自定义属性给子组件赋值,进行传递 在子组件中通过 props 属性来接收参数 <body> <div id="app"> ...

  4. 虚拟机ubuntu磁盘扩容

    1.虚拟机把磁盘大小进行改动 2.sudo apt-get install gparted 3.打开安装好的应用 4.进行分区改动 5.理论删除sda2和sda5重整后边即可,但此时sda2和sda5 ...

  5. 20155235 《Java程序设计》 实验五 Java网络编程及安全

    20155235 <Java程序设计> 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 没有Linu ...

  6. [agc001E]BBQ Hard[组合数性质+dp]

    Description 传送门 Solution 题目简化后要求的实际上是$\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}C^{A[i]+A[j]}_{A[i]+A[j]+B[i ...

  7. day 2 函数的嵌套

    1.函数的嵌套     百度百科 2.产品如何运作 3.应用 1)版本1:打印1条线 #1.定义函数 def print_line(): print("-"*50) #2.调用函数 ...

  8. 【CF960G】Bandit Blues

    [CF960G]Bandit Blues 题面 洛谷 题解 思路和这道题一模一样,这里仅仅阐述优化的方法. 看看答案是什么: \[ Ans=C(a+b-2,a-1)\centerdot s(n-1,a ...

  9. centos7下mysql 开启远程登录

    安装mysql 安装mysql就不做过多的介绍了,相信小伙伴们都可以很轻松的安装 进入mysql命令行 mysql -u用户名 -p密码 新建远程登录的用户 grant all on *.* to a ...

  10. Drupal views中实现两列布局

    Views中的format有table,grid,unformatted list等,但是没有2 columns等选项. 如果要达到如下效果: 左侧一列有title,content,右侧一列image ...