本章要学习的是C++中的数据处理,包含以下内容:

1、C++变量的命名规则。

2、C++内置的整型——unsigned long、long、unsigned int、int、unsigned short、short、char、unsigned char、signed char、bool。

3、表示各种整型的系统限制的climits文件。

4、各种整型的数字字面值(常量)。

5、使用const限制符来创建符号常量。

6、C++内置的浮点类型:float、double和long double。

7、表示各种浮点类型的系统限制的cfloat文件。

8、各种浮点类型的数字字面值。

9、C++的算术运算符。

10、自动类型转换和强制类型转换。

一、简单变量

1.1变量名

必须遵循几种简单的C++命名规则:

(1)在名称中只能只用字母字符、数字和下划线。

(2)名称的第一个字符不能是数字。

(3)区分大小写。

(4)不能将关键字用作名称。

(5)以两个下划线或下划线和大写字母打头的名称被保留给实现使用,以一个下划线开头的名称被保留给实现,用作全局标识符。

(6)C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。

倒数第二点与前面几点有些不同,因为使用像_time_stop或_Dount这样的名称不会导致编译器错误,而会导致行为的不确定性。换句话说就是不知道结果将会是什么。不出现编译器错误的原因是,这样的名称不是非法的,但要留给实现使用。

1.2整型

不同的C++整型使用不同的内存量来存储整数,可用术语宽度来描述,内存用到的越多,则越宽。C++的基本整型按宽度递增可分为char、short、int、long和C++11新增的long

long,其中每种类型都有符号版本和无符号版本,共有10种类型可供选择。

计算机内存由一些叫做位(bit)的单元组成。如果在所有系统中,每种类型的宽度都相同,那么使用起来会非常方便。但是生活并不是这么简单的,因此C++提供了一种灵活的标准,它确保了最小长度:

(1)short至少16位。

(2)int至少与short一样长。

(3)long至少32位,且至少与int一样长。

(4)Long long至少64位,且至少与long一样长。

当前很多系统都使用最小长度,即short为16位,long为32位。这仍然为int提供了多种选择,其宽度可以是16位、24位或者32位,同时又符合标准;甚至可以是64位,因为long和long long至少长64位。

有些实现允许选择如何处理int。类型的宽度随实现而异,这可能在将C++程序从一种环境移到另一种环境时引发问题(包括在同一系统中使用不同的编译器)。

要知道系统中整数的最大长度,可以在程序中使用C++工具来检查类型的长度。首先sizeof运算符返回类型或变量的长度,单位为字节,其使用方法是将类型名放到其后的括号中,如下:sizeof(int)。但是“字节”的含义依赖于实现,因此在一个系统中,两字节的int可能是16位,而在另一个系统中可能是32位。其次,头文件climits中包含了关于整型限制的信息,具体的说,它定义了表示各种限制的符号名称,即其定义了符号常量来表示类型的限制。

climits中的符号常量见表https://blog.csdn.net/lvdezhou/article/details/48806831

1.3无符号类型

前面介绍的4种整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。当然,仅当数值不会为负时才应使用无符号类型。要创建无符号版本的基本整型,只需要使用关键字unsigned来修改声明即可。注意unsigned本身是unsigned int的缩写。整型变量的行为就像里程表,如果超越了限制,其值将为范围另一端的取值。C++确保了无符号类型的这种行为,但并不保证符号整型超越限制(上溢和下溢)时不错误,而这正是当前实现种最常见的行为。

1.4选择整型类型

int被设置为对目标计算机而言最为“自然”的长度。自然长度指的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应该使用int。如果知道变量可能表示的整数大于16位整数的最大可能值,则使用long。即使系统上int为32位,也应该这么做。这样,将程序移植到16位系统时,就不会突然无法正常工作。如果要存储的值超过20亿,可使用long long。

如果short比int小,则使用short可以节省内存。通常,仅当有大型整型数组时,才有必要使用short。如果节省内存很重要,则应使用short而不是使用int,即使它们的长度是一样的。

1.5整型字面值

整型字面值(常量)是显式书写的常量,如212或176。与C相同,C++能够以三种不同的计数方式来书写整数:基数为10,即第一位为1-9,也称为十进制;基数为8,第一位为0,第二位位1-7,也称为八进制;基数为16,前两位为0x或0X,也称为十六进制。对于十六进制数,字符a-f和A-F表示了十六进制位,对应于10-15。

在默认情况下,cout以十进制格式显示整数,而不管这些整数在程序中式如何书写的。

但像头文件iostream提供了控制符endl,用于指示cout重起一行一样,它还提供了dec、hex和oct,分别用于指示cout以十进制、十六进制和八进制显示整数。

这些表示方式仅仅是为了表达上的方便,且都能以相同的方式存储在计算机中—被存

储为二进制数。

1.6 char类型:字符和小整数

编程语言通过使用字母的数值来进行字母的存储,所以char类型是另一种整型。它足够长,能够表示目标计算机系统中的所有基本符号——所有的字母、数字、标点符号等。实际上,很多系统支持的字符否不超过128个,因此用一个字节就可以表示所有的符号。因此,虽然char最常被用来处理字符,但也可以将它用作比short更小的整型。

在美国最常用的是ASCII字符集。字符集中的字符用数值编码表示。

因为char为整型,所有可以对其使用整数操作,如加1。这使得C++将字符表示为整数提供了方便,使得操作字符值很容易。不必使用笨重的转换函数在字符和ASCII码之间来回转换。

Cout.put()是一个类ostream的成员函数,用来输出字符,只有通过类的特定对象来使用成员函数,其中句点称为成员运算符。Cout.put()成员函数提供了另一种显示字符的方法,可以替代<<运算符。可能会有人问,为何需要Cout.put()。答案与历史有关。在C++的Release2.0之前,cout将字符变量显示为字符,而将字符常量显示为数字。问题是,C++早期版本与C一样,也将字符常量存储为int类型。也就是说,’M’的编码77将被存储在一个16位或者32位的单元中,而char变量一般占8位。

下面的语句从常量‘M’中复制8位到变量ch中:

Char ch=‘M’;

遗憾的是,这意味着对cout来说,‘M’和ch有天壤之别,虽然它们存储的值相同。因此下面语句将打印$字符的ASCII码,而不是字符$:

Cout<<‘$’;

而下面语句就打印字符$:

Cout.put(‘$’);

在Release2.0之后,C++字符常量存储为char类型,而不是int类型,这意味着cout现在可以正确处理字符常量了。

1.7signed char 和unsigned char

与int不同的是,char在默认情况下既不是没有符号,也不是有符号,是否有符号由C++实现决定,这样编译开发人员可以最大限度地将这种类型与硬件属性匹配起来。如果将char用作数值类型,则unsigned char和signed char之间的差异将非常重要。unsigned char类型的表示范围在0-255,而signed char的表示范围在-128-127.另一方面,如果使用char变量来存储标准的ASCII字符,则char有没有字符都没有关系,在这种情况下,可以使用char。

1.8 wcha_t

程序需要处理的字符集可能无法用一个8位的字节来表示,如日文汉字系统。Wcha_t类型是宽字符类型,可以表示扩展字符集。

1.9bool类型

C++将非零值解释为true,将零解释为false。现在可以使用bool类型来表示真和假了,它们分别用预定义的字面值true和false表示,也就是说,可以这样编写语句:

Bool is_ready=true;

字面值true和false都可以通过提升转换为int类型,true被转换为1,而false被转换为0:

Int ans=true;

Int promise=false;

另外,任何数字值或指针值都可以被隐式转换为bool值。任何非零值都被转换为true,而零被转换为false:

Bool start=-100;

Bool stop=0;

二、const限定符

C++有一种更好的处理符号常量的方法,这种方法就是使用const关键字来修改变量声明和初始化。假如需要一个表示一年中月份数的符号常量,则可写为:

Const int Months=12;

常量Months被初始化后,其值就固定了,编译器将不允许在修改该常量的值。

一种常见的做法是将名称的首字母大写,以提醒你Months是一个常量。另一种约定是将整个名称大写,使用#define创建常量时通常使用这种约定。还有一种约定是以字母k打头,如kmonths。

创建常量的通用格式:

Const type name=value;

相比#define,const更好,首先它能够明确指定类型,其次可以使用C++的作用域规则将定义限制在特定的函数或者文件中,其中作用域规则描述了名称在各种模块中的可知程度。第三,可以将const用于更加复杂的类型,如数组和结构。

三、浮点数

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

调用ostream类的setf()方法,这种调用迫使输出使用定点法,以便更好地了解精度,它防止程序将较大的值切换为E表示法,并使程序显示到小数点后6位。

浮点常量在默认情况下为double类型。

四、C++算术运算符

%运算符求模。要求两个操作数必须都是整型,将该运算符用于浮点数将导致编译错误。如果其中一个是负数,则结果的符号满足如下规则:(a/b)*b+a%b=a。

4.1类型转换

C++自动执行很多类型转换:

1、将一种算术类型的值赋给另一种算术类型的变量时,C++将对其值进行转换。

2、表达式种包含不同的类型时,C++将对值进行转换。

3、将参数传递给函数时,C++对值进行转换。

(1)初始化和赋值进行的转换

(2)以{}方式初始化时进行的转换(C++11)

(3)表达式中的转换

遵循以下规则:

1、如果有一个操作数的类型是long double,则将另一个操作数转换为long double。

2、否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。

3、否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。

4、否则,说明操作数都是整型,因此执行整型提升。

5、在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。

6、如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的界别比有符号操作数的级别高,则将有符号的操作数转换为无符号操作数所属的类型。

7、否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。

8、否则,将两个操作数都转换为有符号类型的无符号版本。

对于整型级别来说,有符号整型按照级别从高到低依次为:long long、long、int、short和signed char。无符号整型的排列顺序与有符号整型相同。类型char、signed char和unsigned char的级别相同。类型bool的级别最低。

(4)传递参数时的转换

(5)强制类型转换

强制类型转换的格式:(typeName) value或typeName (value)。第一种来自C语言,第二种格式的C++。

五、总结

1、C++的基本类型分为两组:一组由存储为整数的值组成,另一组由存储为浮点格式的值组成。整型之间通过存储值时使用的内存量及有无符号来区分。整型从最小到最大依次为:bool、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned lon以及C++11新增的long long和unsigned long long。

2、浮点类型可以表示小数值以及比整型能够表示的值大得多的值。

C++详细学习笔记(二)相关推荐

  1. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  2. 陈宝林《最优化理论与算法》超详细学习笔记 (二)————补充知识(凸集) 第二章 线性规划的基本性质

    陈宝林<最优化理论与算法>超详细学习笔记 (二)----补充知识 凸集 & 第二章 线性规划的基本性质 补充知识 凸集 方向与极方向 表示定理 择一定理 第一章 线性规划的基本性质 ...

  3. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  4. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  5. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  6. 二维码学习笔记(二) | 数据分析与数据编码

    唠唠闲话 二维码笔记系列(原文地址): 『二维码学习笔记(一) | 二维码概述』 『二维码学习笔记(二) | 数据分析与数据编码』 『二维码学习笔记(三) | 纠错编码』 『二维码学习笔记(四) | ...

  7. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

  8. Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)

    所有示例使用的数据表均为Oracle提供的SQL基础数据表(t_employees.sql dept.sql emp.sql salgrade.sql) 熟练掌握多多练习即可达到完成后端开发所需具备的 ...

  9. 学习笔记二.矩阵按键

    #学习笔记二:GPIO的探索与矩阵按键 ##1.在配置cubemx时,对gpio的配置有开漏输出和推挽输出两种方式, ###这里有一篇文章(别人的文章)讲的很详细link戳这里跳转 通俗来讲,推挽输出 ...

  10. 陈宝林《最优化理论与算法》超详细学习笔记 (八)————最优性条件

    陈宝林<最优化理论与算法>超详细学习笔记 (八)----最优性条件 无约束问题的极值条件 必要条件 二阶充分条件 充要条件 约束极值问题的最优性条件 不等式约束的一阶最优性条件 无约束问题 ...

最新文章

  1. FSWD_BootStrap
  2. cnn识别cifar10、cifar100(pytorch)
  3. C++的Json解析库:jsoncpp和boost
  4. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选
  5. SmartSVN:File has inconsistent newlines
  6. java 去除 quot,JAVA去除web页面传入后台的特殊字符工具类 | 学步园
  7. 【java】java JUC 同步器框架 AQS AbstractQueuedSynchronizer源码图文分析
  8. vue执行操作成功但页面不刷新_vue.js数据更新页面不刷新
  9. Python使用matplotlib可视化模拟家庭支出情况雷达图
  10. 线程池合适的线程数量
  11. PikPak磁力网盘
  12. wincc远程服务器配置,WINCC-OPC服务器配置
  13. 程序员的悲哀是什么?
  14. 使用STM32CubeMX和SW4STM32在Nucleo-F401RE开发板轻松实现Blinky闪烁 [
  15. 矩阵论极简笔记(1):如何降维度打击
  16. 深入理解Android之Java Security第一部分
  17. 毕业一年升阿里P6的晋升总结
  18. OpenSUSE安装配置TeXLive2015.iso、前端软件Kile、Lyx、TeXstudio及TeX的更新管理界面的使用
  19. iOS开发:获取WiFi名称(解决iOS12.0以上系统不能正常获取WiFi名称的方法)
  20. win10左右声道音量不一致的解决方法

热门文章

  1. 学生成绩管理系统——课程设计报告
  2. 江南电子计算机研究所,我的中国“芯” | 江南计算所SW1600:国产超算“神威蓝光”的“心脏”-控制器/处理器-与非网...
  3. hibernate date mysql 时间段查询
  4. Refused to load the image 'URL' because it violates the following content security polity diretive
  5. 多路调频广播解调器说明书
  6. 4. Python面向对象语法——类的构造函数
  7. java练习题之华氏摄氏度与摄氏度的转化。
  8. CV街景门牌号码识别02_数据读取与增广
  9. java请求url加密_SpringCloud-Config通过Java访问URL对敏感词加密解密
  10. 林家翘先生提醒青年学者:千万不要Garbage in,garbage out