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. .net下redis和rabbitmq简单使用demo

    是参考 一下两篇博文整理了下. Redis:   https://www.cnblogs.com/5ishare/p/6492380.html RabbitMq:   https://www.cnbl ...

  2. 嵌入式C语言自我修养 06:U-boot镜像自拷贝分析:section属性

    6.1 GNU C 的扩展关键字:attribute GNU C 增加一个 __atttribute__ 关键字用来声明一个函数.变量或类型的特殊属性.声明这个特殊属性有什么用呢?主要用途就是指导编译 ...

  3. 5.18-笨办法学python-习题14

    有了习题13的基础,习题14就不是问题了. 这一节主要是一个简单的提示符.提示符就是像">"这个的东西,因为我们之前用input的时候,它是用来让用户输入的,可是平常人并不知 ...

  4. package html to native application

    npm install nw -g npm . https://github.com/nwjs/nw.js/ https://github.com/nwjs/nw.js/wiki/How-to-run ...

  5. 20155214曾士轩 2016-2017-2 《Java程序设计》第1周学习总结

    20155214曾士轩 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 1.标准API的架构指的是什么? 2.一个项 ...

  6. noone is not in the sudoers file ubuntu

      Login as root or su to get root prompt type visudo an editor will open find a line says root ALL=( ...

  7. 18、Java线程面试题 Top 50

    Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html   本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...

  8. Kettle数据源连接配置

    说明: 通过(图3.1)我们可以看到创建数据源时需要配置相应的参数: Connection Name(必填):配置数据源使用名称,如:Rot_Source Host Name(必填):数据库主机IP地 ...

  9. Maven学习(一)-----Maven安装配置总结

    想要安装 Apache Maven 在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. 所需工具 : JDK 1.8 M ...

  10. 基础SQL语句学习

    (注:sql对大小写不敏感,附:命令行操作:cd 目录名 可进入文件,cd .. 可返回上级木目录) 下载MySQL,并配置环境变量: 使用命令行操作数据库(也可下载navicat操作),输入mysq ...