文章目录
- 2 数据类型
- 2.1 简单变量
- 2.2 基本数据类型
- 2.2.1 整型
- 2.2.2 实型(浮点型)
- 2.2.3 字符型
- 2.2.4 布尔类型
- 2.3 sizeof关键字
- 2.4 类型转换
- 2.5 转义字符
- 2.6 重新谈及变量
- 2.6.1 字面值常量
- 2.6.2 变量
- 2.6.3 列表初始化
- 2.7 数据的输入
2 数据类型
2.1 简单变量
程序通常都需要存储信息,而当我们把信息存储在计算机中,程序必须记录3个基本属性:
- 信息要存储在哪里?
- 要存储什么值?
- 存储何种类型的信息
C++规定在创建一个变量或者常量时,必须要指定相应的数据类型,否则无法给变量分配内存。
那上面这个图来举例,我们给利用int指定系统给变量开辟多大的空间,10用来往空间里面存放数据,而a作为变量名用来操纵这个数据,虽然C++没有告诉你这个值存储在内存的什么位置,但程序确实记录了这个位置,如果你想查看这个值所在的内存地址,你只需要用&即可访问。
由此可知,数据类型存在的意义是给变量分配合适的内存空间。
面向对象编程的本质是设计并扩展自己的数据类型,设计自己的数据类型就是让类型与数据匹配。如果正确做到了这一点,以后使用自己的数据类型会方便很多。然而,在创建自己的类型之前,必须先了解一些C++内置的基本类型:如整数、浮点数。但是C++提供了多种变体,包括数组、字符串、指针和结构体等。
2.2 基本数据类型
2.2.1 整型
整型变量表示的是整数类型
的数据,而需要注意的是,整型也有划分,分为带符号(signed)
和无符号(unsigned)
。带符号指的就是带正负号的那种,无符号就是只能表示0和大于0的数了。
C++中能够表示整型的类型由以下几种方式,区别在于所占内存空间不同:
数据类型 | 占用字节 | 取值范围 |
---|---|---|
short(短整型) | 2 | (-2^15 ~ 2^15-1) |
int(整型) | 4 | (-2^31 ~ 2^31-1) |
long(长整型) | window为4,linux为4(32位),8(64位) | (-2^31 ~ 2^31-1) |
long long(长长整型) | 8 | (-2^63 ~ 2^63-1) |
如果想要得到无符号类型,只需在有符号类型的数据类型前添加unsigned
关键字即可。
如何选择
很多人都会发懵,对于Java来讲并没有这么多数据类型,而对于C++却有,这是因为C++要尽可能地去接近硬件,为此,C++的数据类型比其他的高级编程语言数据类型要多得多。
那在定义的时候,我们应该如何需选择数据类型呢?
- 在知晓数值不可能为负时,我们可以选用无符号类型
- 如果数值很大,超出了int的范围,那可以选择long
- 使用浮点数尽量用double,不要用float,因为float精度不够而且运算double和float的代价差别不大。
位和字节
计算机内存由一些叫位的单元组成,C++中的这些整型都通过使用不同数目的位来存储值。如果我们用位来衡量上面的数据类型,那么:
数据类型 占用位 short 至少16位 int 至少和short一样长 long 至少32位 long long 至少64位 前面说到的位(Bit)可以当做电子开关,可以开可以关,关表示0,开表示1;比如8位的内存,1位就能0和1,那么8位就是282^828即256。所以8位的单元可以理解为0 ~ 255或者-128 ~ 127,按刚才的理解的话,每增加一位,组合数翻倍。
字节(byte)通常指的是8位的内存单元。从这个意义来说,字节指的是描述计算机内存量的度量单位,1KB等于1024字节,1MB等于1024KB。
2.2.2 实型(浮点型)
浮点型用于表示小数,浮点型变量分为两种:
-
单精度float
-
双精度double
两者的区别在于表示的有效数字范围不同。
数据类型 | 占用字节 | 有效数字范围 |
---|---|---|
float | 4 | 7位有效数字 |
double | 8 | 15-16位有效数字 |
实例:
#include <iostream>
using namespace std;int main()
{//1、单精度 float//2、双精度 doublefloat f1 = 3.14f;cout << "f1 = " << f1 << endl;double d1 = 3.14;cout << "d1 = " << d1 << endl;cout << "float sizeof = " << sizeof(f1) << endl;cout << "double sizeof = " << sizeof(d1) << endl;//科学计数法float f2 = 3e2;//3*10^2cout << "f2 = " << f2 << endl;float f3 = 3e-2;//3*0.1^2cout << "f3 = " << f3 << endl;system("pause");return 0;
}
2.2.3 字符型
单引号括起来的单个字符我们一般叫做char型字面值,如:‘a’。
字符型变量用于显示单个字符。其表示为:char ch = 'a'
。
这种表示方法有几个注意的点:
- 在显示字符型变量时,用单引号将字符括起来,不要用双引号
- 单引号内只能有一个字符,不可以是字符串
- C和C++中字符型变量只占用一个字节
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入存储单元。
ASCII
实际上,在美国最常用的符号集是ASCII字符集,但是C++实现使用的是其主机系统的编码,例如IBM大型机使用EBCDIC编码。
在下面的代码中,让我们仔细体会字符型变量创建的方法、字符型变量所占内存的大小、容易犯的一些错误,以及字符型变量对应ASCII编码。
#include <iostream>
using namespace std;int main()
{//1、字符型变量创建方式char ch = 'a';cout << ch << endl;//2、字符型变量所占内存大小cout << "char ch sizeof = " << sizeof(ch) << endl;//3、字符型变量常见错误//char ch2 = "b";//创建字符型变量的时候,要用单引号//char ch2 = 'abcdef'; //创建字符型变量的时候,单引号内只能有一个字符//4、字符型变量对应ASCII编码//a - 97cout << (int)ch << endl;system("pause");return 0;
}
out:
2.2.4 布尔类型
布尔数据类型代表真或假的值,其只有两种值:
- true:真(本质是1)
- false:假(本质是0)
如果当你定义了一个布尔类型,而后复制给其大于1的数如42,那么在输出时它会默认转为1,相当于true。
试着敲一下下面的代码,你可以体会到我说的话。
#include <iostream>
using namespace std;int main()
{bool a = 42;//a为真cout << a << endl;bool b = true;//b为真cout << b << endl;bool c = false;//c为假cout << c << endl;system("pause");return 0;
}
out:
2.3 sizeof关键字
利用sizeof关键字可以统计数据类型所占内存大小,基本语法为:sizeof(数据类型/变量)
让我们试着动一下手体会其用法。
#include <iostream>
using namespace std;int main()
{//1、短整型short num1 = 10;cout << sizeof(num1) << endl;//2、整型int num2 = 10;cout << sizeof(num2) << endl;//3、长整型long num3 = 10;cout << sizeof(num3) << endl;//4、长长整型long long num4 = 10;cout << sizeof(num4) << endl;system("pause");return 0;
}
out:
以上的只是整型,我们再看看浮点型和字符型还有布尔类型所占的大小是多少。
#include <iostream>
using namespace std;int main()
{char a = 'A';float b = 2.03;double c = 2.03;bool d = true;cout << "字符型变量的大小:" << sizeof(a) << endl;cout << "单精度浮点型变量的大小:" << sizeof(b) << endl;cout << "双精度浮点型变量的大小:" << sizeof(c) << endl;cout << "布尔型变量的大小:" << sizeof(d) << endl;
}
out:
2.4 类型转换
不同的对象类型是可以被转换的。当你定义变量时等号左右的数据类型表示的是不一样的东西时,C++会隐式地帮你做一个转换,当然,得能转换才行。
当然,你也可以采用显示转换,用数据类型(要转换的数据)
这样的格式去显示转换数据。
#include <iostream>
using namespace std;int main()
{float b = int(2.03);cout << b << endl;
}
out:
2.5 转义字符
在C++以及其他编程语言中,都有一些字符是打印不出来的,它们常常有特殊的含义。如果想要打印这些字符,就得在字符前加上特定的转义符号。
符号 | 说明 |
---|---|
\n | 换行符 |
\v | 纵向制表符 |
\ \ | 反斜线 |
\r | 回车符 |
\t | 横向制表符 |
\b | 退格符 |
? | 问号 |
\f | 进纸符 |
\a | 报警符 |
\ " | 双引号 |
\ ’ | 单引号 |
我们试着敲一段代码,它能帮我们理顺上述说的东西。
#include <iostream>
using namespace std;int main()
{char str = '\"';cout << str << endl;char str1 = '\?';cout << str1 << endl;system("pause");return 0;
}
out:
2.6 重新谈及变量
2.6.1 字面值常量
在谈到变量前,我们需要知道什么叫字面值常量。
字面值常量就是字面上的常量,如随意给出一个数据42,‘a’,我们没有指定数据类型,只给出了个数据,那么它就是一种字面值常量。
需要知道的是,字面值常量通常直接就可以看出其所对应的数据类型。如’a’从形式上看,用了单引号,而且只用了一个字母,应该就是字符型变量。
2.6.2 变量
变量提供了一个名字和空间,空间中放着数据。我们上述提到的所有数据类型都可以决定变量所占内存空间大小和布局。
对于C++程序员来说,变量和对象两个术语一般可以交替使用。
变量一般命名都是以数据类型说明符开始,随后紧跟一个或多个变量名,多个变量名间以逗号隔开,最后以分号结束。定义的时候,我们还可以为多个变量同时赋值。
我们试着敲一下下面的代码,体会我说的话。
#include <iostream>
using namespace std;int main()
{int a = 1;int b = 10, c = 20;cout << a << endl;cout << b << endl;cout << c << endl;
}
在创建变量时,需要注意的一点是一定要初始化,即赋予变量一个初值。如果不赋予初值,后续的程序极有可能出问题。初值可以是一个确定的字面值也可以是一个复杂表达式。
赋值和初始化
其实根本无需追究两术语的差别。赋值指的是擦除当前变量中的值换一个值,而初始化是创建变量时赋予的初值。
初始化并不是必须的,你也可以不初始化,编译器不会报错,它会帮你生成一个初值,int整型会生成0,char会生成空字符串,但是一般没人会去这么干,我也不推荐你这么干。
你可以试着敲一下以下的代码体会一下,这个可能会在考试中出现,但开发就别这么干了。
#include <iostream> using namespace std; string global_str; int global_int; double global_double;int main() {cout << global_int << endl;cout << global_str << endl;cout << global_double << endl; }
out:
2.6.3 列表初始化
在C++11的新标准中,首次出现了采用花括号来初始化变量的这一问题。如下所示,四种初始化方式是等价的。
#include <iostream>
using namespace std;int main()
{int a = 0;int b = { 0 };int c{ 0 };int d(0);cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;
}
out:
2.7 数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin>>变量
示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{//1、整型int a = 0;cout << "请给整型变量a赋值:" << endl;cin >> a;cout << "整型变量a = " << a << endl;//2、浮点型float f = 3.14f;cout << "请给浮点型变量赋值:" << endl;cin >> f;cout << "浮点型变量f = " << f << endl;//3、字符型char ch = 'a';cout << "请给字符型变量ch赋值:" << endl;cin >> ch;cout << "字符型变量f = " << ch << endl;//4、字符串型string str = "hello world";cout << "请给字符串str赋值:" << endl;cin >> str;cout << "字符串str" << str << endl;//5、布尔类型bool flag = false;cout << "请给布尔类型flag赋值" << flag << endl;cin >> flag;cout << "布尔类型flag = " << flag << endl;//只要非零的数都是真system("pause");return 0;
}