C++ Primer Plus学习:第三章
C++入门第三章:处理数据
面向对象编程(OOP)的本质是设计并扩展自己的数据类型。
内置的C++数据类型分为基本类型和复合类型。
基本类型分为整数和浮点数。
复合类型分为数组、字符串、指针和结构。
C++通过使用变量来存储数据。
简单变量
为把信息存储在计算机中,程序必须记录三个基本属性:
- 信息将存储在哪里
- 要存储什么值
- 存储何种类型的信息
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学习:第三章的更多相关文章
- C Primer Plus 学习 第三章
这里只记录我自己以前不懂得地方,明白的地方就略过了 位 字节 字 位 0,1 字节 8位 也就有8位0,1的组合 2的8次方的组合 字 设计计算机时给定的自然存储单元.8位 ...
- Java基础知识二次学习--第三章 面向对象
第三章 面向对象 时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...
- Struts2框架学习第三章——Struts2基础
本章要点 — Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 — WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...
- C#高级编程 (第六版) 学习 第三章:对象和类型
第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上 2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件 函数成员 方法:与某个类相关的函数,可以 ...
- C语言学习第三章
写在课前,提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号! 今天主要学习掌握if...else条件结构,多重if条件 ...
- C++PRIMER 阅读笔记 第三章
本章主要介绍 string vector 和 bitset, 不能贪多,现在本文主要介绍 string 与 vector 头文件中最好不要使用namespace std, 因为头文件会直接被预处理器放 ...
- 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor
参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...
- 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-2-autograd
参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 torch.autograd就是为了方 ...
- C++ Primer Plus学习:第九章
C++第九章:内存模型与名称空间 C++在内存中存储数据方面提供了多种选择.可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等. 单独编译 程序分为三个部分: ...
- C++ Primer Plus学习:第二章
C++入门第二章:开始学习C++ 进入C++ 首先,以下是一个C++程序: //myfirst.cpp 显示一行文字 #include<iostream> //预处理器编译指令 int m ...
随机推荐
- PL/SQL报错:ORA-28000:the account is locked
第一种方法(图形操作):第一步:使用PL/SQL,登录名为system,选择类型的时候把Normal修改为SYSDBA:第二步:选择users下的system,右击点击“编辑”: 第三步:修改密码,把 ...
- Java操作Redis(一)
一.创建项目,导入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis& ...
- vue中组件间的传参
1.父传子 父组件准备一个数据,通过自定义属性给子组件赋值,进行传递 在子组件中通过 props 属性来接收参数 <body> <div id="app"> ...
- 虚拟机ubuntu磁盘扩容
1.虚拟机把磁盘大小进行改动 2.sudo apt-get install gparted 3.打开安装好的应用 4.进行分区改动 5.理论删除sda2和sda5重整后边即可,但此时sda2和sda5 ...
- 20155235 《Java程序设计》 实验五 Java网络编程及安全
20155235 <Java程序设计> 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 没有Linu ...
- [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 ...
- day 2 函数的嵌套
1.函数的嵌套 百度百科 2.产品如何运作 3.应用 1)版本1:打印1条线 #1.定义函数 def print_line(): print("-"*50) #2.调用函数 ...
- 【CF960G】Bandit Blues
[CF960G]Bandit Blues 题面 洛谷 题解 思路和这道题一模一样,这里仅仅阐述优化的方法. 看看答案是什么: \[ Ans=C(a+b-2,a-1)\centerdot s(n-1,a ...
- centos7下mysql 开启远程登录
安装mysql 安装mysql就不做过多的介绍了,相信小伙伴们都可以很轻松的安装 进入mysql命令行 mysql -u用户名 -p密码 新建远程登录的用户 grant all on *.* to a ...
- Drupal views中实现两列布局
Views中的format有table,grid,unformatted list等,但是没有2 columns等选项. 如果要达到如下效果: 左侧一列有title,content,右侧一列image ...