文章目录
1. 基本数据类型
七种基本的C++数据类型:bool、char、int、float、double、void、wchar_t。
类型修饰符:signed、unsigned、short、long、long long。
如果想知道类型或者变量的大小可以通过下列的方式。
#include <iostream>
using namespace std;
int main()
{
cout<<"bool:"<<sizeof(bool)<<endl
<<"char:"<<sizeof(char)<<endl
<<"float:"<<sizeof(float)<<endl
<<"double:"<<sizeof(double)<<endl
<<"long:"<<sizeof(long)<<endl
<<"long long :"<<sizeof(long long)<<endl;
return 0;
}
输出如下:
bool:1
char:1
float:4
double:8
long:8
long long :8
2. 整数字面类型
C++能够以三种不同的计数方式来书写整数:基数为10、基数为8(老式UNIX版本)、基数为16(硬件黑客的最爱)。
以42为例:他们对应的书写方式为42,042和0x42(或0X42),10进制含义分别表示为42,34和66。
程序表示如下:
#include <iostream>
using namespace std;
int main()
{
int num10 = 42;//十进制
int num8 = 042;//八进制
int num16 = 0x42;//十六进制
cout<<num10<<endl
<<num8<<endl
<<num16<<endl;
return 0;
}
3. char类型和wchar_t
3.1 char
char专门为存储字符而设计的。对于计算机来说,存储数字已经不算什么,但存储字母又是另外一回事。编程语言使用字母的数值编码解决了这个问题,因此,char类型是另一种整形。
它可以表示128个字符,采用ASCII编码,具体形式见课本附件C。例如字符A的编码为65,字母M的编码为77。
char的输出方式有两种,cout和cout.put,后者专用于char输出,他们的输出都是char对应的字符。如需输出对应编码,可以转换为int类型。代码如下。
#include <iostream>
using namespace std;
int main()
{
char ch = 'A';
cout<<ch<<endl;
cout.put(ch);
int intA = ch;
cout<<endl<<intA<<endl;
return 0;
}
输出为:
A
A
65
3.2 转义字符
有些字符不能通过键盘输入到程序中。例如,按回车键并能使字符串包含一个换行符。对于特殊字符,C++提供了一种特殊的表示方法——转义序列。转义序列可以在字符常量或者字符串中使用。如
#include <iostream>
using namespace std;
int main()
{
char alarm = '\a';//表示振铃
int intAlarm = alarm;
cout<<intAlarm<<endl;
cout<<"他说:\"大家好!\""<<endl;
}
输出:
7
他说:"大家好!"
根据上表显示,我们可以知道"\n"和“\012”(八进制),“\0xa”(十六进制)都表示换行。
测试代码:
#include<string>
#include<iostream>
using namespace std;
int main()
{
cout<<"test1\012";
cout<<"test2"<<"\0xa";//用QT测试,这里16进制好像有一点问题?
cout<<"test3\n";
cout<<"test4"<<endl;
}
3.3 signed char和unsigned char
与int类型不同的是,char在默认情况下既不是没有符号,也不是有符号。如果需要特殊选定,则可以人工添加类型。
unsigned char表示0~255,而signed char表示-128~127.
3.4 通用字符名
例如法语的特殊符号就很难在ASCII中表示出来,于是我们就有了Unicode和ISO 10646编码,他们两者的编码是同步的。
通用字符名可以用\u:后面接8个16进制位。\U:后面接16个十六进制位。如:
int k\u00F6rper;
3.5 wcha_t
在国际上,128位不能很好地满足国际需要,C++支持宽字符类型,可以存储更多的值,如国际Unicode字符集。
cin和cout将输入和输出看做char流,因此不适用于wchar_t。iostream提供了相似的工具wcin和wcout。
本书不介绍wchar_t,但是我们应该知道这种类型,尤其是在Unicode和ISO10646时。
C++新增了char16_t和char32_t类型,他们分别为无符号的16位和无符号的32位。在C++11中使用分别使用前缀加u和前缀加U表示。如:
#include <iostream>
using namespace std;
int main()
{
char16_t ch1 = u'q';
char32_t ch2 = U'\U0000222B';
cout<<ch1<<endl;
cout<<ch2<<endl;
return 0;
}
输出为:
113
8747
4. bool类型
bool可以和int互相转换,int的非0即为true,0则为false。例如
int ans =true;//转换为1
int promise =false;//转换为0
bool start = -100;//转换为true
bool stop = 0;//转换为false
5. define与const限定符
- #define
#define INT_MAX 32737
#define类似于#include,也是一个预处理编译指令,在程序中查找INT_MAX,并将所有的INT_MAX替换成30767,修改后的程序将在完成替换后被编译。
#define是C语言遗留下来的,在C++中,有一个更好的创建符号常量的方法const。但是有些头文件,被设计成可用于C和C++中的头文件,则必须要用#define了。
- const
const是C++中提供的限定常量的关键字,它比define更好。原因如下:
- 它能够明确指定类型。
- 可以使用C++的作用域规则将定义限制在特定的函数或文件中。
- 可以将const用于更复杂的类型,比如数组和结构体。
6. 初始化
注意C++11中的初始化("{}"表示的初始化),不可以进行缩窄操作,例如不允许浮点型转换为整型。
int A =100;//c语言初始化
int A(100);//C++初始化
int A{
100};//C++11初始化
int A = {
100};//C++11初始化
7. 浮点类型
浮点类型在计算机中分两部分存储,一部分表示值,另一部分表示放大或缩小。例如3.1415926和3415.926除了小数点的位置不同外,其他相同。3.14表示为0.314(基准)和10(缩放因子)。
C++中有三种浮点类型:float、double和long double。
7.1 两种表示方式
- 标准小数点法:
12.34- E表示法
2.52e+8或者2.52E+8//表示10的8次方
2.52e-8//表示10的-8次方
d.ddE+n:表示小数点右移8位,d.ddE-n表示小数点向左移8位。
7.2 浮点数的优缺点
-
优点
可以表示整数之间的值
具有缩放因子 -
缺点
浮点运算的速度通常比整数运算慢,且精度将降低。下面举例说明。
#include <iostream>
using namespace std;
int main()
{
float a = 2.34E+22f;
float b = a + 1.0f;
cout<<"a = "<<a<<endl;
cout<<"b - a ="<<b - a<<endl;
}
输出结果:
a = 2.34e+22
b - a =0
因为2.34E+22是一个小数点左边有23位的数字。加上1,就是在第23位加1。但是float类型只能表示数字中的前6位或者7位,因此修改第23位对这个值没有影响,所以输出不变。
8. C++算数运算符
C++中提供了5种算数计算:加法、减法、乘法、除法以及求模。(+ - * / % )
另外C++中还有自加自减运算符:++和–
8.1 类型转换
强制类型转换的两种表示:
(long) thorn
long (thorn)
其中thorn本身不会被改变,而是创建一个新的、指定类型的值。
C++还引入4个强制类型转换运算符。将在后续介绍补充。
8.2 C++11中的auto声明
auto是C语言的关键字,但很少使用。C++11对它进行了扩展。它的作用是让编译器根据初始值的类型推断变量的类型。例如:
auto n = 100;//n表示int
auto x = 1.5;//x表示double
又如:
std::vector<double> scores;
auto pv = scores.begin();
文章参考:《C++ Primer Plus第六版》