C++ Primer Plus 随笔 (第三章 数据处理)

●C++变量的命名规则。

    为把信息存储在让算机中,程序必须记录3个基本属性:
      ●信息将存储在哪里;
      ●要存储什么值;
      ●存储何种 类型的信息。

1、C++名命规则

●在名称中只能使用字母字符、数字和下划线( _)。
●名称的第一个字符不能是数字。
●区分大写字符与小写字符。
●不能将Ct+关键字用作名称。
●以两个下划线或下划线和大写字母打头的名称被保留给实现: (编译器及其使用的资源) _使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
●C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。

●C++内置的 整型一unsigned long、long、 unsigned int、int、 unsigned short、short、char、 unsigned char、signed char和bool。

整型short、int、 long 和long long

    如果在所有的系统中,每种类型的宽度都相同,则使用起来将非常方便。例如,如果short总是16位,int 总是32位,等等。不过生活并非那么简单,没有一-种选择能够满足所有的计算机设计要求。C++提供了一种灵活的标准,它确保了最小长度(从C语言借鉴而来),如下所示:
     ●short至少16位;
     ●int至少与short一样长;
     ●long至少32位,且至少与int 一样长;
     ●long long至少64位,且至少与long 一样长。

初始化

    初始化将赋值与声明合并在一起。

int n = 10;

    如果知道变量的初始值应该是什么,则应对它进行初始化。将变量声明和赋值分开,可能会带来瞬间悬而未决的问题:

short year ;
year = 1024;

C+11初始化方式

    还有另一种初始化方式,这种方式用于数组和结构,但在C++98中,也可用于单值变量:

int number = {24};

    将大括号初始化器用于单值变量的情形还不多,但C++11标准使得这种情形更多了。首先,采用这种方式时,可以使用等号(=), 也可以不使用:

int emus {7};
int rheas = {12};

    其次,大括号内可以不包含任何东西。在这种情况下,变量将被初始化为零:

超出限制

    该程序将一个 short变量(sam)和- -个unsigned short变量(sue) 分别设置为最大的short值,在我们的系统上,是32767.然后,将这些变量的值都加1。这对于sue来说没有什么问题,因为新值仍比无符号整数的最大值小得多:但sam的值从32767变成了-32768!同样,对于sam,将其设置为0并减去1,也不会有问题;但对于无符号变量sue,将其设置为0并减去后,它变成了65535。可以看出,这些整型变量的行为就像里程表。如果超越了限制,其值将为范围另一端的取值(参见图3.1)。C++确保了无符号类型的这种行为: 但C++并不保证符号整型超越限制(. 上溢和下溢)时不出错,而这正是当前实现中最为常见的行为。

成员函数cout.put()

    cout.put( )到底是什么东西?其名称中为何有一个句点?.函数cout.put( )是一个重要的C++ OOP概念成员函数的 一个例子。类定义了如何表示和控制数据。成员函数归类所有,描述了操纵类数据的方法。例如类ostream有一个pu()成员函数,用来输出字符。只能通过类的特定对象(例如这里的cout对象)来使用成员函数。要通过对象(如cout)使用成员函数,必须用句点将对象名和函数名称(put()) 连接起来。句点被称为成员运算符。cout.put( )的意思是,通过类对象cout来使用函数put()。

char字面值

在C++中,书写字符常量的方式有多种。对于常规字符(如字母、标点符号和数字),最简单的方法是将字符用单引号括起。这种表示法代表的是字符的数值编码。例如,ASCII 系统中的对应情况如下:
      ●’A’为65, 即字符A的ASCII码;
      ●’a’为97, 即字符a的ASCII码;
      ●’5’为53, 即数字5的ASCII码;
      ●’ ‘为32, 即空格字符的ASCII码;
      ●’!'为33, 即惊叹号的ASCII码。
在这里插入图片描述

signed char和unsigned char

    与int 不同的是,char 在默认情况下既不是没有符号,也不是有符号。是否有符号由C++实现决定,这样编译器开发人员可以最大限度地将这种类型与硬件属性匹配起来。如果char有某种特定的行为对您来说非常重要,则可以显式地将类型设置为signed char或unsigned char:
如果将char用作数值类型,则unsigned char和signed char之间的差异将非常重要。unsigned char类型的表示范围通常为0~255,而signed char的表示范围为-128到127。例如,假设要使用一个char变量来存储像200这样大的值,则在某些系统上可以,而在另一些 系统上可能不可以。但使用unsigned char可以在任何系统上达到这种目的。另-方面,如果使用char变量来存储标准ASCIr字符,则char有没有符号都没关系,在这种情况下,可以使用char.

bool类型

    George Boole,是他开发了逻辑律的数学表示法。在计算中,布尔变量的值可以是true或false.过去,C++和C一样,也没有布尔类型。在第5章和第6章中将会看到,C++将非零值解释为true,将零解释为false7然而,现在可以使用bool类型来表示真和假了,它们分别用预定义的字面值true和false 表示。也就是说,: 可以这样编写语句:

bool is_ ready = true;

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

运算符sizeof和头文件limits

    sizeof运算符指出,在使用8位字节的系统中,int 的长度为4个字节。可对类型名或变量名使用sizeof运算符。对类型名(如int)使用sizeof运算符时,应将名称放在括号中:但对变量名(如n_ short) 使用该运算符,括号是可选的:
在这里插入图片描述
在这里插入图片描述

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

至少和double - -样多。这三种类型的有效位数可以一样多。然而,通常,float 为32位,double 为64位,至少和double 一样多。这三种类型的有效位数可以一样多。然而,通常,float 为32位,double 为64位,long double为80、96或128位。另外,这3种类型的指数范围至少是-37到37。可以从头文件cfloat或float.h中找到系统的限制。(cfloat 是C语言的floath文件的E++版本。)下面是Borland E++ Builder的float.h=文件中的一-些批注项:
在这里插入图片描述

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

整型字面值

赋值时可以赋值十进制数字也可以赋值十六进制数字

#include <iostream>
int main()
{
	using namespace std;
	int chest = 42; // decimal integer literal
	int waist = 0x42;// hexadecimal integer literal
	int inseam = 042;// octal integer literal
	cout << "Monsieur cuts a striking figure!\n" ;
	cout << "chest =”<< chest <<”(42 in decimal) \n";
	cout << "waist =”<< waist <<”(0x42 in hex) \n";
	cout << "inseam =”<< inseam <<”(042 in octal) \n" ;
	return 0;
}

●使用const限定符来创建符号常量。

    常量被初始化后,其值就被固定了,编译器将不允许再修改该常量的值。如果您这样做,g++将指出程序试图给一个只读变量赋值。”
如果在声明常量时没有提供值,则该常量的值将是不确定的,且无法修改。
如果以前使用过C语言,您可能觉得前面讨论的#define语句已经足够完成这样的工作了。但const比#defien好。首先,,它能够明确指定类型。其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中(作用域规则描述了名称在各种模块中的可知程度,将在第9章讨论)。第三,可以将const用于更复;杂的类型,如第4章将介绍的数组和结构。

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

1、浮点数类型

    事实上,C和C++对于有效位数的要求是,float至少32位, double至少48位,且不少于float, long double至少和double -样多。这三种类型的有效位数可以一样多。然而,通常,float 为32位,double 为64位,long double为80、96或128位。另外,这3种类型的指数范围至少是37到37。
预览了将在第17章介绍的ostream方法setf( )。这种调用迫使输出使用定点表示法,以便更好地了解精度,它防止程序把较大的值切换为E表示法,并使程序显示到小数点后6位。

2、浮点数的优缺点

    与整数相比,浮点数有两大优点。首先,它们可以表示整数之间的值。其次,由于有缩放因子,它们可以表示的范围大得多。另一方面,浮点运算的速度通常比整数运算慢,且精度将降低。下面程序清单说明了最后一点。

#include < iostream>
int main()
{
	using namespace std;
	float a = 2.34E+22f;
	float b = a + 1.0f;
	cout <<"a = "<< a<< endl;
	cout << "b - a = " << b - a << endl;
	return 0;
	
}

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

在这里插入图片描述

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

1、书写浮点数

    C++有两种书写浮点数的方式。第一种是使用常用的标准小数点表示法。
第二种表示浮点值的方法叫做E表示法,其外观是像这样的: 3.45E6, 这指的是3.45与1000000相乘的结果; E6 指的是10的6次方,即1后面6个0。因此,3.45E6 表示的是3450000. 6被称为指数,3.45被称为尾数。

●C++的算术运算符。

1、五种运算符

下面是5种基本的C++算术运算符。
      ● + 运算符对操作数执行加法运算。例如,4+20 等于24。
      ● - 运算符从第-一个数中减去第二个数。例如,12-3 等于9。
      ● * 运 算符将操作数相乘。例如,28*4 等于112。
      ● / 运算符用第 一个数除以第二个数。例如,1000/5 等于200。如果两个操作数都是整数,则结果为商的整数部分。例如,17/3 等于5,小数部分被丢弃。
      ● % 运算符求模。也就是说,它生成第一个数除以第二个数后的余数。例如,19%6 为1,因为19是6的3倍余1。两个操作数必须都是整型,将该运算符用于浮点数将导致编译错误。如果其中一个是负数,则结果的符号满足如下规则: (a/b)*b+a%b = a。

2、商的类型

    除法运算符(/)的行为取决于操作数的类型。如果两个操作数都是整数,则C++将执行整数除法。这意味着结果的小数部分将被丢弃,使得最后的结果是一个整数。如果其中有一个(或两个)操作数是浮点值,则小数部分将保留,结果为浮点数。

3、类型转化

    C++丰富的类型允许根据需求选择不同的类型,这也使计算机的操作更复杂。例如,将两个short值相加涉及到的硬件编译指令可能会与将两个long值相加不同。由于有11种整型和3种浮点类型,因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时。为处理这种潜在的混乱,C++自动执行很;多类型转换:
       ●将一种算术类型的值赋给 另一种算术类型的变量时,C+ +将对值进行转换;
       ●表达式中包含不同的类型时,C++将对值进行转换;
       ●将参数传递给函数时,C++将对值进行转换。

●自动类型转换。

1、初始化和赋值进行的转化

    将一个值赋给值取值范围更大的类型通常不会导致什么问题。例如,将short值赋给long变量并不会改变这个值,只是占用的字节更多而已。然而,将一个很大的long值(如2111222333)赋给float变量将降低精度。因为float只有6位有效数字,因此这个值将被四舍五入为2.1H122E9。因此,有些转换是安全的,有些则会带来麻烦。表3.3列出了一些可能出现的转换问题。
在这里插入图片描述
    将0赋给bool变量时,将被转换为false;而非零值将被转换为true。
    将浮点值赋给整型将导致两个问题。首先,将浮点值转换为整型会将数字截短(除掉小数部分)。其次,float值对于int变量来说可能太大了。在这种情况下,C++并没有定义结果应该是什么;这意味着不同的实现的反应可能不同。

2、表达式的转换

    当同一个表达式中包含两种不同的算术类型时,将出现什么情况呢?在这种情况下,C++将执行两种自动转换:首先,一些类型在出现时便会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。
    总之,编译器通过校验表来确定在算术表达式中执行的转换。C++11对这个校验表稍做了修改,下面是C++11版本的校验表,编译器将依次查阅该列表。
    (1)如果有一个操作数的类型是longdouble,则将另一个操作数转换为longdouble。
    (2)否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
    (3)否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
    (4)否则,说明操作数都是整型,因此执行整型提升。
    (5)在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
    (6)如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数一高,则将有符号操作数转换为无符号操作数所属的类型。
    (7)否则之如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
    (8)否则,将两个操作数都转换为有符号类型的无符号版本。

3、C++11 auto

    C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。为此,它重新定义了auto的含义。auto 是一个C语言关键字,但很少使用,有关其以前的含义,请参阅第9章。在初始化声明中,如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:

auto n = 100; // n is int
auto x = 1.5; // x is double
auto y = 1.3e12L // y is long double

●强制类型转换。

1、通过类型强转
    C++还允许通过强制类型转换机制显式地进行类型转换。(C++认识到,必须有类型规则,而有时又需要推翻这些规则。)强制类型转换的格式有两种。例如,为将存储在变量thomr中的int值转换为long类型。

int  thomr;
long (thomr);
//或者
(long) thomr;
发布了64 篇原创文章 · 获赞 406 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/famur/article/details/105437141