C/C++的数据类型
C++的数据类型
已使用的数据类型: 字符串类型, 整数类型
什么是数据类型:现实社会中的人,分成很多”类型”,“物以类聚, 人以群分”,不同类型的人, 思考问题,处理问题的方式都不一样。计算机中的数据, 也分成很多类型:
int | unsigned int | char |
unsigned char | long | long long |
unsigned long | short | unsigned short |
float | double | 各种指针类型 |
枚举类型 | struct结构类型 | union联合类型 |
bool | string | 类 |
C++ 完全支持C语言的各种数据类型。不同数据类型的区别:表示意义不同、占用内存不同、表示的范围不同、使用方法不同。数据类型使用不当,将导致严重的后果:对于程序员:隐藏BUG、对于系统:隐藏灾难
变量
变量,不是数学中的变量,是内存中的一块存储空间,即一小块内存。。程序在运行时,需要保存很多内容常常变化的数据。一个程序运行时,大量数据存储在“变量”中。数据在大量变量之间“计算”、“交换”。变量是处理数据的基本实体。
变量和数据类型有什么关系?
变量,是一个盒子,盒子里保存了“数据”,数据又分成很多“类型”(数据类型)。变量的类型,就是变量中数据的类型。变量在定义(创建)时,必须先指定它的类型。
相当于:制作一个盒子时,必须先确认这个盒子是用来装什么的,1个变量只有1个类型,而且不能改成其他类型
变量的定义
定义形式1:int x; int y;
定义形式2:(不推荐)int x, y;
定义形式3:(定义的时候,设置一个初始值)(推荐)int a = 100;
内存的存储单位,是字节。一个字节,包含8位二进制位。
变量名的命名规范
只能包含3种字符(数字、大/小写字母,下划线);不能以数字开头(只能以字母或下划线开头);不能和“关键字”同名(c语言内部已经使用的“名称”),比如类型名int。
变量名:最好“顾名思义”,不用使用汉语拼英的简写!比如:用name表示姓名,用power表示功率。
命名风格:
1)下划线风格: int student_age; (一般用于变量名、函数名)
2)小驼峰风格 int studentAge; (一般用于变量名、函数名)
3)大驼峰风格 class StudentAge; (一般用于“类名”)
4)全部大写 (一般用于宏) #define MAX_AGE 30
请忘记“匈牙利命名法”(属性+类型+对象描述)
int类型
int类型使用最多的整数类型,在内存中占4个字节,表示范围:-(2的31次方) 2的31次方-1 【正负21亿左右】
长整形long
long 也就是 long int,可用来存储更大的整数。在32位系统上,占4个字节,和int相同。在64位系统上,占8个字节【正负9百亿亿左右】
长长整形long long
用来存储整数。在内存中占8字节。很少使用,仅用于特殊的计算。
短整形short
用来存储整数。在内存中占2字节。用于存储小范围的整数。表示范围:- (2的15次方) ~ 2的15次方-1 【正负3万多】
无符号类型
没有负数。unsigned int、unsigned long、unsigned long long、unsigned short。最小值都是0, 最大值是对应的有符号数的2倍。
经典用法:unsigned short port; //用来表示网络通信的端口号(0-65535)
unsigned int num; //表示编号(0到四十多亿)
char单字符类型
单个字符:‘0’ ‘1’ ‘2’ ‘3’ ...... ‘9’、‘a’ ‘b’ ‘c’ ‘d’ ...... ‘z’、‘A’ ‘B’ ‘C’ ‘D’ ......‘Z’、‘,’ ‘-’ ‘!’ ‘#’ .......单个字符常量, 要求用‘’括起来
字符的实际表示:
所有的字符,使用对应的ASCII值来存储。(因为计算机中只能存储0和1的组合)。ASCII码,使用1个字节(包含8个二进制位,即8个0和1的组合)。
比如:’A’ , 用 0100 0001 来表示,就是65。‘B’, 用 0100 0010 来表示, 就是66
char name = ‘a’;等效于:char name = 97;
char类型的另一种用法:用来表示小范围的整数(-128 ~ 127),不过现在开发时,小范围的整数,也常常直接用int类型。
实例:int x = 0; x = ‘a’ + 1; // 97 + 1
注意: 1 和 ‘1’的区别:int x = 1; char y = ‘1’; //49
float类型(单精度浮点类型)
需要精确计算的数学、工程应用,用整数类型不合适。用来存储带小数部分的数据。在内存中占用4个字节。表示范围:-3.4*10^38~+3.4*10^38 (不需记忆)。
精度:最长7位有效数字(是指7位10进制位)。float y = 1.123456789;//精度只能取值到 1.1234568, 在第7位(整数部分不算)是四舍五入后的值。
float类型的存储方式:
符号位:0代表正数,1代表负数。阶码: 指数+127。尾数 * 2 ^ (阶码-127)
转化过程:(了解)float x = 13.625;
13.625 的转化:13.625,13 -> 1101
![]() .625 -> .101 0.625 * 2 = 1.25 取整 1 ,剩下0.25 0.25 * 2 = 0.5 取整 0 , 剩下0.5 0.5 * 2 = 1 取整 1 ,剩下0 按顺序得到 101(直到小数部分为0) 13.625 => 1101.101 1101.101 小数点向左移动3位 => 1.101101 (要求移动到整数部分只有1位) 所以,阶码 = 3 + 127 = 130 二进制形式为:10000010 移位后的小数部分是 .101101 尾数存储二进制的101101 实际存储为: ![]() |
常量
字面常量
int类型字面常量:1, 2, 3, 100
long 类型字面常量:200L (或200l, 建议用大写字母L)。注意:使用vs编译时,默认都是win32平台,所以即使在64位系统中,long也只有4个字节
long long 类型字面常量:100000000000LL(一千亿,建议用大写字母LL)
char类型字面常量:’a’, ‘b’, ‘X’, ‘-’
float类型字面常量:3.14f
double类型字面常量: 3.0 3.14
16进制常量:
123 = 1x100 + 2x10 + 3x1;0x11 (相当于17);以0x作为前缀说明:16进制
10进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
8进制常量
以0作为前缀,011(相当于9),说明:16进制和8进制,只是给程序员使用起来更方便,在计算机中,数据都存储为2进制。
字面常量的缺点:程序的可读性变差、代码的可维护性差。
符号常量
#define宏定义的符号常量
#define MAX_AGE 35 //在编译的预处理阶段,直接把MAX_AGE替换为35
const修饰的符号常量
const int maxAge = 35;
maxAge = 30; //错误!编译失败
注意:const修饰的符号常量,又叫“只读变量”。本质上,是一个变量,只是被const限制。
字符串
字符串就是0个或多个“字符”组成的“有序”序列。
字符串长度指字符串包含的字符个数(不是指中文)。空字符串的长度是0。“”是空字符串常量,没有一个字符,长度是0。“ ”是空格字符串常量,包含1个空格,长度是1。
“god” 的字符串长度是 3,“我爱你” 的字符串长度不是3 ,是6或9(在某些编码中,一个汉字占用2个直接,有些编码中占3个字节)
“字面型”字符串常量,要求用“”扩起来。
printf("name=%s", "China"); //C语言方式输出字符串,%s用来匹配字符串
cout << “China”; //C++方式输出字符串
字符串结束符
在c语言中,为了便于存储字符串,要求在最后一个字符的后面存储一个0(一个字节)。这个0, 称为“字符串结束符”,常用 ‘\0’ 表示。
“China” => ‘C’ ‘h’ ‘i’ ‘n’ ‘a’ ‘\0’; “” => ‘\0’
在C++语言中,字符串的最后并没有字符串结束符!实际存储时,根据编译器的不同,最后可能存储一个字符串结束符,也可能没有。
字符串变量的表示
在C语言中,使用char类型的数组,来存储字符串变量。注:C语言中,没有专用的字符串类型。
在C++中,使用std::string类型来表示字符串变量。
string变量的定义、初始化
//定义了一个字符串变量,此时,该字符串是空字符串。
string girlFriend1;
girlFriend1 = "王菲"; //把字符串常量"王菲"拷贝到girlFriend1
cout << "girlFriend1 = " << girlFriend1 << endl;
string girlFriend2;
girlFriend2 = girlFriend1; //把字符串变量girlFriend1的值拷贝到girlFriend2
cout << "girlFriend2 = " << girlFriend2 << endl;
//定义girlFriend3的同时,使用字符串常量"周迅"来初始化
string girlFriend3("周迅");
cout << "girlFriend3 = " << girlFriend3 << endl;
//定义girlFriend4的同时,使用字符串变量来初始化
string girlFriend4(girlFriend3);
cout << "girlFriend4 = " << girlFriend4 << endl;
string girlFriend5(10, 'A');
cout << "girlFriend5 = " << girlFriend5 << endl;
string变量的输入、输出
使用std::cin >> 输入,从第一个非空白字开始,直到遇到空白字符时停止输入。空白字符是指:空格,制表符,回车符
使用std::cout << 输出
//demo1-基本的输入输出
string job;
cout << "你是做什么工作的?" << endl;
cin >> job;
cout << "做" << job << ",收入一定不错吧?" << endl;
//demo2-自动跳过空白字符
string university; //大学
string profession; //专业
cout << "你是哪个学习毕业的?学什么专业? ";
// 输入: 清华 考古 hello
// 自动跳过空白字符
cin >> university >> profession;
cout << university << "的" << profession << "专业不错哦!" << endl;
//demo3 -连续输入多个字符串,个数不确定
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(void) {
string food; //专业
int i = 0;
cout << "你喜欢什么美食? ";
while (cin >> food) { //当用户输入 Ctrl + z 并回车 cin >> food返回0, 0就是假
i = i + 1;
cout << "你喜欢的第" << i << "美食是:" << food << endl ;
cout << "你还喜欢吃什么美食? ";
}
cout << "你最喜欢的美食有" << i << "种" << endl;
system("pause");
return 0;
}
//demo4 - 读取一行getline
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(void) {
string addr; //专业
cout << "你想到哪里去旅行:";
//从标准输入设备读取一行,但是不包括最后输入的回车符
getline(cin, addr);
//empty方法
if (addr.empty() == true) {
cout << "您输入了一个空行" << endl;
return 1;
}
//size()和length()完全等效
//长度是指字符串占用的字节数,如果含有汉字,那么总的字节数和汉字个数不同
cout << "地址的长度是:" << addr.size() << endl;
cout << "地址的长度是:" << addr.length() << endl;
system("pause");
return 0;
}
string字符串的比较
比较规则:和C语言相同。从字符串的第一个字符开始,对应字符逐个比较,直到遇到不相等的字符为止。比较运算符有:> >= < <= == 。比较运算的结果:逻辑真, 逻辑假
“2” > “1999” 真 “123” == “1230” 假
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(void) {
string myGirl = "小芳";
string yourGirl;
cout << "我喜欢的女孩子是" << myGirl << endl;
cout << "你喜欢的女孩是:";
cin >> yourGirl;
if (myGirl == yourGirl)
{
cout << "我们喜欢同一人,过来决斗吧" << endl;
}
else
{
cout << "祝你幸福";
}
system("pause");
return 0;
}
注意:c语言的字符串,不能使用这个方式来进行字符串比较。
string字符串的加法
把+左侧的字符串,和+右侧的字符串,直接拼接成一个新的字符串。注意顺序。(C语言的字符串不支持该方式)
注意与数学中的“加法”不同:“100” + “200” 等于 “300“100” + “200” 等于 “100200”” ,
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
int main(void) {
string s1 = "武当派";
string s2 = "张三丰";
string s4;
s4 = s1 + s2; //武当派张三丰
cout << "s4=" << s4 << endl;
system("pause");
return 0;
}
C语言风格的字符串char数组
在c语言中,字符串是以“字符数组”存储的。
#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;
int main(void) {
char name[32]; //C语言风格的字符串
/*
使用C语言的函数,来处理C语言字符串
printf("请输入您的名字:");
scanf("%s", name);
printf("%s, 你好!\n", name);
*/
// 使用C++的方式,来处理C语言字符串
cout << "请输入您的名字:";
cin >> name;
cout << name << ",你好!" << endl;
system("pause");
return 0;
}