C++详细学习笔记(二)

本章要学习的是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、浮点类型可以表示小数值以及比整型能够表示的值大得多的值。


  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值