当前位置: 首页 > news >正文

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

实际存储为:

布尔类型

C++语言中,有两种bool(布尔)类型的表示方式:直接使用bool类型:bool  x = true;

bool类型, 只有两个值:true、false

C语言风格:使用0和非0的任何值,0: 表示假、非0: 表示真

常见错误:3>2>1 是假        3>2>1  =>   true>1  =>  1>1   =>  false

bool类型使用场合:if 语句、for语句、while语句

常量

字面常量

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 = "王菲";  //把字符串常量"王菲"拷贝到girlFriend1cout << "girlFriend1 = " << girlFriend1 << endl;string girlFriend2; girlFriend2 = girlFriend1; //把字符串变量girlFriend1的值拷贝到girlFriend2cout << "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语言中,字符串是以“字符数组”存储的。

数组

        数组,就是多个元素的有序“组合”。C和C++语言中的数组:相同大小的内存块组成,即相同类型的数据、 编号从0开始递增、而且这些编号是递增顺序。数组的“容量”是不能改变的。

数组的定义

数组和其他变量一样,需要先定义,再使用。

实例:int   a[8];        //定义了一个数组,数组名是“a”,包含8个元素,每个元素是int类型的变量,8个变量是连续存储在内存中的

a[0] = 20;        a[1] = 5;

数组的初始化

在定义数组的同时,设置数组内的元素值。        

int a[8] = {20, 5, 30, 13, 18};
printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]);
//或者cout << a[0] << “,” << a[1] << “,” << a[2] << “,” << a[3] << “,” << a[4];
int a[8] = {0};  //把数组的所有元素都初始化为0
int a[8] = {1};  //把a[0]初始化为1,其它值都初始化为0
int b[8] = {1, 5};  //把a[0]初始化为1,a[1]初始化为5,其它值都初始化为0
int a[] = {1,2,5}; //定义数组a, 这个数组包含3个元素!
// 根据“初始化列表”,自动计算数组的容量
/*
高逼格用法(在某些特殊场合使用)
优点:但数组的成员较多时,该方式可读性高
缺点:仅仅C编译器支持,C++编译器中不支持,即C++程序中不能使用。
//每周的锻炼时间:
int exercises[7] = {
[1] = 1, //a[1] = 1
[3] = 2, //a[3] = 2
//没有指定的成员,被初始化为0
};
*/

数组的内元素的访问

通过下标访问对应的元素。特别注意, 数组的第一个元素的下标是0, 而不是1。

另类用法:使用下标的方式访问string字符串

string name = "12345";
//name[i]是string字符串中的第i个字符(char类型)
for (int i=0; i< name.length(); i++) 
{cout << name[i];
}
name[0] = 'L';  //name变成:L2345
cout << endl << name;

数组的越界

数组的越界, 是指下标超出正常的范围!例如:int  a[10];  //a[-1] 和 a[10]都是越界!

越界后果:可能导致数据破坏,或其他不可预期的后果!

越界控制:需要程序员自己手动控制,编译器不做任何检查!因为,C/C++语言完全信任程序员!

C风格的字符串详解

C语言字符串的存储、初始化

字符串,是通过“字符数组”(元素类型为char的数组)来存储的!

//demo1
char  name[10];
name[0] = '1';
name[1] = '2';
name[2] = '3';
name[3] = '4';
name[4] = 0;  //字符串结束符0,就是 '\0'
printf("姓名:%s", name); 
name[2] = 0;
printf("姓名:%s", name);   //demo2
char  name[10] = "1234"; //相当于char name[10] = {'1', '2', '3', '4', '\0'};
printf("姓名:%s", name);//demo3
char  name[] = "1234";  //相当于:name[5] = "1234"
printf("%d", sizeof(name)); //5

C语言字符串的输入输出

#include <stdio.h>
#include <Windows.h>int main(void) {
char name[16];
char addr[64];printf("姑娘芳名?\n");
scanf("%s", name);
//此时输入缓冲区中还有一个回车符
//清空输入缓冲区
fflush(stdin);printf("姑娘家住何地?\n");
gets(addr); //读一行,包括一行中的空格printf("家住%s 的%s, 我中意你!\n", addr, name);system("pause");
return 0;
}


http://www.mrgr.cn/news/98362.html

相关文章:

  • 数据库原理及应用mysql版陈业斌实验三
  • mongodb 安装配置
  • AI 项目详细开发步骤指南
  • antv x6使用(支持节点排序、新增节点、编辑节点、删除节点、选中节点)
  • 【Java集合】HashMap源码深度分析
  • 大数据面试问答-批处理性能优化
  • poi-tl
  • Spark-SQL核心编程(一)
  • 【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
  • Kubernetes Operator 是什么,以及它们的用途
  • 基于瑞芯微RK3576 国产ARM八核2.2GHz A72 NPU 6T AI——MQTT通信方案
  • #4 我们为什么使用物联网? 以及 物联网的整体结构
  • 优先级队列(堆二叉树)底层的实现:
  • Codeforces Round 1017 (Div. 4)题解
  • 9.thinkphp的请求
  • 【STL】set
  • 【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
  • 前端工程化之自动化构建
  • 07软件测试需求分析案例-修改用户信息
  • UNITY 屏幕UI自适应