目录
2.1.3 整型short、int、long和long long
到目前为止,我们学过的策略都是声明一个变量。声明中使用的类型描述了信息的类型和通过符号来表示其值的变量名。
比如:
int braincount;
braincount = 5;
程序将找到能存储整数的内存,将该内存单元标志为braincount,并将5复制到该内存单元中;然后你可以在程序中使用braincount来访问这一个内存单元。这些语句没有告诉我们这个值将存储到内存中的什么位置,但程序确实记录了这种信息。实际上可以使用&运算符来检索braincount的内存地址。
2.1.1 变量名命名规则
(1) 在名称中只能使用字母字符,数字和下划线(_)
(2) 名称的第一个字符不能是数字
(3) 区分大写字符和小写字符
(4) 不能将C++关键字用作名称
(5) 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源所使用)。以一个下划线开头的名称被保留给实现,用作全局标识符。
(6) C++对于名称的长度没有限制,名称中的所有字符都有意义,但是有些平台有长度限制。
2.1.2 整型
整型就是没有小数点的数字,C++提供好几种整型,这样能够根据程序的具体要求选择最合适的整型。
不同的C++整型使用不同的内存量来存储整数,内存越大,所表示的范围也越大。术语宽度(width)用于描述存储整数时使用的内存量,使用的内存越多,则越宽。C++的基本整型(按宽度递增的顺序排列),分别是char、short、int、long和C++11新增的long long,其中每种类型都有符号版本和无符号版本,因此总共有10种类型可供选择,下面先对于除char外的展开介绍。实际上short就是short int的简称,其他也是如此。
2.1.3 整型short、int、long和long long
计算机内存中有一些叫做位(bit)的单元组成,C++中的short、int、long、和long long类型通过不同数目的位来存储值,最多能够表示4种不同的整数宽度,但是不同的计算机系统中,不同的类型的宽度可能不一样,因此C++提供了一种灵活的标准,他确保了最小长度(从C语言中借鉴而来)
如下所示:
(1) short至少16位
(2) int至少和short一样长
(3) long至少32位,且至少和int一样长
(4) long long至少64位,且至少和long一样长
注:要知道系统中整数的最大长度,可以在程序中使用使用C++工具来检查类型的长度。
首先,sizeof运算符返回类型或变量的长度,单位为字节。
其次,头文件climits中包含了整型限制的信息。具体地说,他定义了各种限制的符号名称。例如,INT_MAX为int的最大取值,CHAR_BIT为字节的位数,下面这个代码进行了演示:
#include<iostream>
#include<climits>
int main() {
using namespace std;
int n_int = INT_MAX;
int n_short = SHRT_MAX;
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
cout << "int is " << sizeof(int) << " bytes." << endl;
cout << "short is " << sizeof n_short << " bytes." << endl;
cout << "long is " << sizeof n_long << " bytes." << endl;
cout << "llong is " << sizeof n_llong << " bytes." << endl;
cout << endl;
cout << "Maximum values:" << endl;
cout << "int: " << n_int << endl;
cout << "short: " << n_short << endl;
cout << "long: " << n_long << endl;
cout << "llong: " << n_llong << endl;
cout << "Minimum int value: " << INT_MIN << endl;
cout << "Bits per byte = " << CHAR_BIT << endl;
return 0;
}
我们来看一下程序的编程特性:
1、运算符sizeof和头文件climits
(1) 可对类型名或变量名使用sizeof运算符;对类型名(如int)使用sizeof运算符时,应将名称放在括号中;但对变量名(如n_short)使用该运算符,括号时可选的。
(2) 头文件climits定义了符号常量来表示类型的限制
2、初始化
初始化将赋值和声明合并在一起。例如,下面的语句声明了变量n_int,并将int的最大值赋给他:
int n_int = INT_MAX;
也可以使用字面值常量来进行初始化。可以将变量初始化为另一个变量,条件是后者已经定义过。甚至可以使用表达式来初始化变量,条件是当程序执行到该声明时,表达式中所有的值都是已知的:
int uncles = 5;
int aunts = uncles;
int chairs = aunts + uncles + 4;
如果将uncles的声明移动到语句列表的最后,则另外两条初始化语句将非法,因为这样当程序试图对其他变量进行初始化时,uncles的值是未知的。
前面的初始化语法来自于C语言,C++还有另一种C语言没有的初始化语法:
int owls = 101; //传统C语言初始化
int wrens(432);
如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的。这意味着该变量的值将是他被创建之前,相应内存单元保存的值。
3、C++11初始化方式
还有另一种初始化方式,这种方式用于数组和结构,但在C++98中,也可用于单值变量:
int hamburgers = {24};
将大括号初始化器用于单值变量的情形还不多,但C++11标准使得这种情形变多了。
首先,采用这种方式时,可以使用等号(=),也可以不使用:
int enum{7};
int rheas = {12};
其次,大括号内可以不包含任何东西。在这种情况下,变量将被初始化为0:
int rocs = {};
int psychics{};
通过C++新增的大括号初始化器,初始化常规变量的方式和初始化类变量的方式更像。C++使得可将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。
2.1.4 无符号类型
前面介绍的4种整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。当然,仅当数值不会为负时才应使用无符号类型。要创建无符号版本的基本整型,只需要使用关键字unsigned来修改声明即可。
注意:unsigned是unsigned int的缩写
2.1.5 C++如何确定常量的类型
程序的声明将特定的整型变量的类型告诉了C++编译器,但编译器是怎样知道常量的类型呢?假设在程序中使用常量表示一个数字。
cout << "year = " << 1492 << endl;
C++一般将整型常量存储为int类型,除非有理由存储成其他值(如使用了特殊的后缀来表示特定的类型,或者值太大,不能存储为int)。
(1) 首先来看看后缀。后缀是放在数字常量后面的字母,用于表示类型。
整数后面的l或者L后缀表示该整数为long常量,u或U后缀表示unsigned int常量。ul(可以采用任意一种顺序,且字母大小写均可)表示unsigned long常量
C++11提供了用于表示类型long long的后缀ll和LL,还提供了用于表示类型unsigned long long的后缀ull、Ull、uLL、ULL。
(2) 接下来考察长度。在C++中,对于不带后缀的十进制整数,将使用下面几种类型中能够存储该数的最小类型来表示:int、long、long long。(注意:没有short)
2.1.6 char类型:字符和小整数
char类型是专门为存储字符(如字母和数字)设计的,存储数字对于计算机来说不算什么,但是存储字母则是另一回事。编程语言通过使用字母的数值编码解决了这个问题。因此,char类型本质上是另一种整型。他足够长,能够表示目标计算机系统中的所有符号——所有字母、数字、标点符号等。实际上,很多系统支持的字符都不超过128个,因此只用一个字节就可以表示所有的符号。
因此,虽然char最常被用来处理字符,但也可以将他用作比short更小的整型。
接下来看一个例子:
#include<iostream>
int main() {
using namespace std;
char ch;
cout << "Enter a character: " << endl;
cin >> ch;
cout << "Hola! ";
cout << "Thank you for the " << ch << " character." << endl;
return 0;
}
假设我们在要求输入的时候输入'M'将会出现以下的输出:
Enter a character:
M
Hola! Thank you for the M character.
D:\Programme\VisualStudio\data\Project2\x64\Debug\Project2.exe (进程 7428)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
程序输入的是M,而不是对应的字符编码77,另外程序将打印M,而不是77。通过查看内存可以知道,77是存储在变量ch的值,这种神奇的力量不是来自char类型,而是来自cin和cout,这些工具帮助完成转化工作。
cin将键盘输入的M转化为77;输出时,cout将数值77转化为所显示的字符M;cin和cout的行为都是由变量类型引导的。如果将77存储在int当中,则cout将他显示为77。
下面是一个例子:
#include<iostream>
int main() {
using namespace std;
char ch = 'M';
int i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
cout << "Add one to the character code:" << endl;
ch = ch + 1;
i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
cout << "Displaying char ch using cout.put(ch): ";
cout.put(ch);
cout.put('i');
//cout.put('o');
cout << endl << "Done" << endl;
return 0;
}
1、程序说明
C++对字符用单引号,对字符串用双引号
2、成员函数cout.put()
函数cout.put()是一个重要的C++OOP概念——成员函数——的第一个例子。
类定义了如何表示和控制数据。成员函数归类所有,描述了操纵类数据的方法。例如类ostream中有一个put()成员函数,用来输出字符。只能通过类的特定对象(例如这里的cout对象来使用成员函数)。要通过对象(如cout)使用成员函数,必须用句点将对象名和函数名称(put())连接起来。
句点被成为成员运算符。cout.put()的意思是,通过类对象cout使用函数put()。cout.put()成员函数提供了另一种显示字符的方法,可以代替<<运算符
3、char字面值
C++中的转义字符
例如:
换行符 \n
水平制表符 \t
垂直制表符 \v
退格 \b
回车 \r
振铃 \a
反斜杠 \\
问号 \?
单引号 \'
双引号 \"
注意:应该像常规字符一样处理转义序列。也就是说:将他们作为字符常量时,应用单引号括起;将他们放在字符串时,不需要使用单引号。
换行符可替代endl,用于在输出中重启一行。下面三行代码都将光标移动到下一行开头:
cout << endl;
cout << '\n'; //作为字符常量出现
cout << "\n"; //在字符串中出现
可以将换行符嵌入到较长的字符串中
4、signed char和unsigned char
与int不同的是,char在默认情况下既不是没有符号,也不是有符号。是否有符号由C++实现来决定,这样编译器开发人员可以最大限度的将这种类型和硬件属性匹配起来。如果将char用作数值类型,则signed char和unsigned char之间的差异将非常重要。unsigned char类型的表示范围通常为0~255,而signed char的表示范围通常为-128~127.
例如,假设要使用一个char变量来存储200这样大的值,则在某些系统上可以,而在另一些系统上可能不可以,但是unsigned char可以在任何系统中达到这一目的
2.1.7 bool类型
在计算中布尔变量的值可以是true或者false,C++将非0值解释为true,将0值解释为false,可以这样编写语句:
bool is_ready = true;
字面值true和false都可以通过提升转化为int类型,true被转化为1,而false被转化为0。
另外,任何数字值或指针值都可以被隐式转化(即不用显式强制转换)为bool值。任何非0值都被转化为true,而0被转化为false。