程序声明将整型变量的类型告诉了C++编译器,但编译器如何知道常量类型呢?
除非有理由(如使用特殊后缀,或者值太大无法存储为int),不然都将存储为int类型
后缀是放在数字常量后面的字母
l、L表示long常量
u、U表示unsigned int
ul(UL)或lu(LU)表示unsigned int
ll、LL为long long
ull、Ull、uLL、ULL为unsigned long long
对不带后缀的十进制整数,使用能够存储该数的最小类型来表示:int、long或long long。
对不带后缀的八、十六进制数,采用能存储该数的最小类型来表示:int、unsigned int、long、unsigned long、long long和unsigned long long
因为十六进制常用来表示地址,没有符号,所以unsigned long 比long更合适
char专为存储字符(字母和数字)
很多系统支持的字符不超过128个,则用一个字节可表示所有符号
char比short更小
//chartype.cpp - - the char type #include<iostream> int main() { using namespace std; char ch; cout << "Enter a charcter:" << endl; cin >> ch; cin.get(); cout << "Hola!"; cout << "Thank you for the " << ch << " character." << endl; cin.get(); }
输入时,cin将键盘输入的M转化为77,输出时,cout将77转换为所要显示的字符M
//morechar.cpp - - the char type and int type contrasted #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('!'); cout << endl << "done" << endl; cin.get(); }
‘M’表示M的字符编码
char ch; cin>>ch;
如果输入5按回车,则将5对应的字符编码“53”存储到ch中。
int n; cin>>n;
如果输入5,则将数值5存储到n中。
1.成员函数cout.put()
类定义了如何表示和控制字符,成员函数归类所有,描述了操纵类数据的方法。
如类ostream有一个put()成员函数,用来输出字符,只能通过类的特定对象来使用成员函数。
句点被称为成员运算符,cout.put()表示通过类对象来使用函数put()
因为历史上,C++的Release 2.0以前,cout将字符变量显示为字符,将字符常量显示为数字。(如‘M’、‘N’)
cout<<ch得到M
cout <<'M'得到77
不过现在已经可以正确的处理字符了
2.char字面值
一般最简单的方法就是将字符用单引号括起,书写字符
但有些字符不能通过键盘输入到程序中,故采用特殊的方法——转义序列
字符名称 | ASCII符号 | C++代码 | 十进制ASCII码 | 十六进制ASCII码 |
换行符 | NL(LF) | \n | 10 | 0xA |
水平制表符 | HT | \t | 9 | 0x9 |
垂直制表符 | VT | \v | 11 | 0xB |
退格 | BS | \b | 8 | 0x8 |
回车 | CR | \r | 13 | 0xD |
振铃 | BEL | \a | 7 | 0x7 |
反斜杠 | \ | \\ | 92 | 0x5C |
问号 | ? | \? | 63 | 0x3F |
单引号 | ' | \' | 39 | 0x27 |
双引号 | " | \" | 34 | 0x22 |
将它们作为字符常量时,应用单引号括起,将它们放在字符串中,不要使用单引号
显示数字时,使用endl比\n容易些,但显示字符串时,\n更容易些,如
cout<<x<<endl;
cout<<"Dr.X.\n";
以下三个都是换行符:
cout<<endl;
cout<<'\n';
cout<<"n";
在使用数字转义序列或符号转义序列时应使用符号序列。数字与特定的编码方式相关,符号适用于任何编码方式,可读性也强。
程序清单3.7 bondini.cpp
//bondini.cpp - - using escape sequences #include<iostream> int main() { using namespace std; cout << "\aOperation \"HyperHype\" is now activated!\n"; cout << "Enter your agent code:________\b\b\b\b\b\b\b\b"; long code; cin >> code; cin.get(); cout << "\aYou entered " << code << "...\n"; cout << "\aCode verified!Proceed with plan Z3!\n"; cin.get(); }
3.通用字符名
如:
int k\u00F6rper;
cout<<"Let them eat g\u00E2teau.\n"
Ö的ISO 10646码点为00F6,而â的码点为00E2.
上述变量名为kÖrper,输出为Let them eat gâteau.
通用字符名的用法类似于转义字符,以\u和\U打头,\u后面是8个十六进制位,\U后面是16个十六进制位。
Unicode为大量字符和符号提供标准数值编码,给每个字符指定一个编号——码点,如U-222B。ASCII码是它的子集。
4.signed char和unsigned char
与int不同的是,char在默认情况下既不是没符号,也不是有符号,是开发人员最大限度的将这种类型和硬件属性匹配起来。
5.wchar_t
程序需要处理的字符集可能无法用一个8位的字节表示
1.如果大型字符集是实现的基本字符集,则可将char定义为一个16位或更长的字节
2.一种实现可以同时支持一个小型基本字符集(char表示)和一个较大的扩展字符集(wchar_t表示)
wchar_t bob=L'P'; wcout<<L"tall"<<endl;
wcin和wcout用来处理wchar_t流,加上前缀L来指示宽字符常量和宽字符串。
新增了char16_t和char32_t
前者是16位,后者32位,都是无符号的
char16_t与/u00F6通用字符名匹配,char32_t与/U0000222B匹配
char16_t ch1=u'q'; char32_t ch2=U'\U0000222B';
6.bool类型
将非零值解释为true,将零解释为false
bool is_ready=true; int ans=true; //ans=1 int promise=false; //promise=0 bool start=-100; //start=true bool stop=0; //stop=false
7.const限定符
const int Months=12;
常量Months被初始化以后,其值就被固定了,编译器将不允许再修改该常量的值
创建常量的通用格式 const type name=value; 应在声明中对const进行初始化 const int toes; toes=10; 如果在声明常量时没有提供值,则该常量值将是不确定的,且无法修改。
8.浮点数
存储浮点数由两部分构成
一部分表示值,一部分表示对值进行放大和缩小
如数字34.1245和34124.5,可将第一个数表示为0.341245和100,第二个表示为0.341245和10000
浮点数由两种写法
一种就是小数点法,另一种是3.45E6,相当于3.45*10的6次方,如果是负数意味着除以10的乘方
浮点类型:
C++对有效位数的要求是:
32≤float≤double≤long double
且double≥48
一般float为32位,double为64位,
long double为80、96或128位
程序清单3.8 floatnum.cpp //floatnum.cpp - - floating-point types #include<iostream> int main() { using namespace std; cout.setf(ios_base::fixed, ios_base::floatfield); float tub = 10.0 / 3.0; double mint = 10.0 / 3.0; const float million = 1.0e6; cout << "tub = " << tub; cout << ", a million tubs = " << million*tub; cout << ",\nand ten million tubs = "; cout << 10 * million*tub<<endl; cout << "mint =" << mint << " and a million mints = "; cout << million*mint << endl; cin.get(); }
setf()调用迫使输出使用定点表示法,以便更好的了解精度,防止程序把较大的值切换为E表示法,将程序显示到小数点后6位。
通常cout会删除结尾的零,用cout.setf()将覆盖这种行为,由于cout打印6位小数,则tub和mint都是精确的,但乘了一百万以后,就有了误差,说明float有7位有效数字,而double至少13位是有效的
默认浮点常量都存储为double类型
1.234f //f或F后缀为float类型
2.45E20F
2.345324E28 //double
2.2L //l或L后缀 long double类型
浮点数两个优点是表示整数之间值,表示范围大。缺点是运算慢,精度会降低。
程序清单3.9 fltadd.cpp //fltadd.cpp - - precision problems with float #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; cin.get(); }
a=2.34e+022
b-a=0
因为float只能表示数字中前6或7位所以修改第23位的值不会有任何影响