三、基本数据类型和计算(一)
三、基本数据类型和计算(一)
1、常量和变量
1)常量和变量定义
常量 | 值不会改变 |
---|---|
变量 | 值可能改变 |
2)常量及变量名起名必须遵守的规则
1 | 不能重名 |
---|---|
2 | 不能和C/C++语言里的关键字重名 |
3 | 必须是字母或者字母和数字的组合,符号仅_可以使用 |
4 | 名字不能用数字开头 |
3)起名字建议遵守的规则
1 | 最好要能够直观表达你这个名字代表的内容 |
---|---|
2 | 名字别太长 |
4)变量定义方式
1 | 类型 名字 {初始值}; | int num {100}; |
---|---|---|
2 | 类型 名字 = {初始值}; | int num={100}; |
5)常量的定义方式
1 | 直接使用值 | 2023 |
---|---|---|
2 | const 类型 名字 {初始值}; | const int number {100}; |
3 | 类型 const 名字 {初始值}; | int const number {100}; |
4 | #define 名字 值 | #define PI 3.14 |
#include <iostream>
#define mon_fix 11 //定义常量
int main()
{
int year{ 2023 }; //定义变量
int mon{ 11 };
int day{ 9 };
const int year_fix{ 2023 }; //定义常量
//year_fix = 2024 常量不可以修改
std::cout << "时间日期显示程序" << std::endl;
std::cout << "今年是" << year_fix << "年" << std::endl; //常量使用
std::cout << "今年是" << year_fix << "年" << mon_fix << "月" << std::endl;
std::cout << "今年是" << year << "年" << mon << "月" << day << "日" << std::endl;
year = 2024; //变量的修改、赋值
std::cout << "今年是" << year << "年" << std::endl;
}
注:不管是常量还是变量,本质上都是在内存中申请一块区域,用来存放我们的数据,只不过常量申请的内存区域不允许修改,而变量申请的内存区域允许修改。以上说的可以修改和不可以修改,只是站在编辑器的角度,实际上,不管是变量还是常量,甚至已经编译好的代码,都可以修改。
2、布尔和整型
1)带符号的整数类型表
类型 | 内存占用(字节) | 取值范围 |
---|---|---|
singed char | 1字节 | -128~127 |
char | 1字节 | -128~127或0-256,取值范围取决于编译器 |
short | 2字节 | -32768~72767 |
short int | 2字节 | -32768~32767 |
singed short | 2字节 | -32768~32767 |
signed short int | 2字节 | -32768~32767 |
int | 4字节 | -232/2~232-1 |
singned | 4字节 | -232/2~232-1 |
singed int | 4字节 | -232/2~232-1 |
long | 4/8字节 | 取决于编译器,x64为8字节,X86为4字节 |
long int | 4/8字节 | 取决于编译器,x64为8字节,X86为4字节 |
singed long | 4/8字节 | 取决于编译器,x64为8字节,X86为4字节 |
signed long int | 4/8字节 | 取决于编译器,x64为8字节,X86为4字节 |
long long | 8字节 | -264/2~264/2-1 |
long long int | 8字节 | -264/2~264/2-1 |
signed long long | 8字节 | -264/2~264/2-1 |
signed long long int | 8字节 | -264/2~264/2-1 |
2)不带符号的整数类型数(即没有负数)
3)布尔类型
注:非0即为true,例-1也表示true
4)分解变量的定义方式
注:使用{}方式初始化,安全性更高,括号中不写内容,默认初始化为0
5)输入和输出
//输入工资,把输入的内容显示出来
#include <iostream>
int main()
{
unsigned short salary; //工资,因后面会进行输入,所以可以不用初始化
unsigned short bonus; //奖金
unsigned short total; //总收入
std::cout << "请输入你的工资:";
std::cin >> salary; //输入
std::cout << "你的工资为:" << salary << std::endl;
std::cout << "请输入你的奖金:";
std::cin >> bonus;
std::cout << "你的奖金为:" << bonus << std::endl;
total = salary + bonus;
std::cout << "你的总收入为:" << total;
}
//若最后运算后的值超过了变量类型的范围,则会溢出
输入过大的数据,会超过变量的定义范围,导致溢出
3、赋值和运算
1)整型字面量的表达
进制 | 表达方式 | 案例 |
---|---|---|
二进制 | 0b+二进制+后缀; | 0b11L |
八进制 | 0+八进制+后缀; | 011L |
十进制 | 十进制数+后缀 | 35L |
十六进制 | 0x+十六进制数+后缀 | 0xFF |
2)关于后缀的说明
符号 | 类型 |
---|---|
L/l | long 类型 |
LL/ll | long long类型 |
U/u | 无符号类型 |
注:U/u可以和L/l或者LL/ll组合使用,如65535ULL
#include <iostream>
int main()
{
std::cout << 0b111 << std::endl; //二进制
std::cout << 0b111U << std::endl; //无符号数的二进制
std::cout << 0b111U << std::endl; //无符号数且类型为long类型的二进制
std::cout << 0b111U << std::endl; //无符号数且类型为long long类型的二进制
}
2)基本的算数运算
运算符名称 | 运算符 | 示例 |
---|---|---|
加 | + | a=b+c;a=a+c |
减 | - | a=b-c;a=a-c |
乘 | * | a=b*c;a=a*c |
除 | / | a=b/c;a=a/c |
模(即取余数) | % | a=b%c;a=a%c |
#include <iostream>
int main()
{
int a{ 100 };
int b{ 3 };
int c{};
c = a / b; //除法运算
std::cout << c << std::endl;
a = a % b; //模运算,即取余数
std::cout << a << std::endl;
}
3)二元运算符
运算符名称 | 运算符 | 示例 |
---|---|---|
加 | += | a+=1;相当于a=a+1 |
减 | -= | a-=1;相当于a=a-1 |
乘法 | *= | a*=1;相当于a=a*1 |
除 | /= | a/=1;相当于a=a/1 |
模 | %= | a%=1;相当于a=a%1 |
#include <iostream>
int main()
{
int a{ 100 };
int b{ 3 };
int c{};
c = a += b; // a=a+b; c=a
std::cout << c << std::endl;
c = a /= b; // a=a/b; c=a
std::cout << c << std::endl;
c = a %= b; // a=a%b; c=a
std::cout << c << std::endl;
}
4)递增递减运算符
名称 | 运算符 | 示例说明 |
---|---|---|
先递增 | ++a; | int a=10;int end=++a+5; //end=16;a=11; |
后递增 | a++; | int a=10;int end=a++ +5; //end=15;a=11; |
先递减 | --a; | int a=10;int end=--a+5; //end=14;a=9; |
后递减 | a--; | int a=10;int end=a-- +5; //end=15;a=9; |
#include <iostream>
int main()
{
int a{ 10 };
int b{ 10 };
int c{ 10 };
int d{ 10 };
int send_1{}, send_2{},send_3{}, send_4{};
send_1 = ++a + 5;
std::cout << "先递增示例:send_1=" << send_1 << ";a=" << a << std::endl;
send_2 = b++ + 5;
std::cout << "后递增示例:send_2=" << send_2 << ";b=" << b << std::endl;
send_3 = --c + 5;
std::cout << "先递减示例:send_3=" << send_3 << ";c=" << c << std::endl;
send_4 = d-- + 5;
std::cout << "先递减示例:send_4=" << send_4 << ";d=" << d << std::endl;
}
注:一次运算最多使用一次递增或者递减,负责容易导致结果不确定,c++标准中可以这么写:end=end++ +1;但是不推荐
4、浮点数
1)浮点数数据类型
类型 | 内存占用(字节) | 取值范围 |
---|---|---|
float | 4字节 | 大约7位精度,±3.4*10^±38 |
double | 8字节 | 大约15位精度,±1.7*10^±38 |
long double | 8字节 | 大约15位精度,±1.7*10^±38 |
注:表示的数若超过进度,后面的数就会用0补充
2)浮点数的表达
后缀符号 | 表示类型 | 示例 |
---|---|---|
f或F | float类型 | 200.0f/200.0F或2E2f |
不加后缀 | double类型 | 200.0 |
L/l | long double类型 | 200L |
注:200.0f和200L区分开,200.0f为float类型;200L为long double类型
3)浮点数注意事项
浮点数不仅可以表达小数,也可以表示整数,E几表示10的几次方,比如1E2=1*10^2=200;
#include <iostream>
int main()
{
float a{ 65923600.0 };
float b{ 0.00000001 };
float c{};
c = a + b;
std::cout << "c的值为:" << c << std::endl; //输出的c的值即为a的值,因为精度丢失了
}
直接通过控制台打印出的数据不准确,可以通过设置断点的方式,查看数据
4)练习:编写一个程序,根据输入的直径,计算圆的面积
//编写一个程序,根据输入的直径,计算圆的面积。面积=半径的平方*圆周率(3.14159)
#include<iostream>
int main()
{
std::cout << "请输入圆的半径(单位cm):";
float d; //直径
std::cin >> d;
float r{ d / 2 }; //半径
float s{ r * r * 3.14159f };
std::cout <<"圆的直径为:"<<d <<std::endl << "圆的面积为:" << s << "平方厘米";
}
5、类型转化
1)类型转化顺序表
如下表所示,优先级从大到小排列,两个优先级不同的数据进行允许,运算结果转化为优先级较高的数据类型。以下表为隐示数据转化
序号 | 数据类型 |
---|---|
1 | long double |
2 | double |
3 | float |
4 | unsigned long long |
5 | long long |
6 | unsinged long |
7 | long |
8 | unsigned int |
9 | int |
注:short和char类型运算时一律转化为int类型
②C++的数据类型转化
//C++的数据类型转化
#include <iostream>
int main()
{
int a{ 500 };
unsigned b{ 1000 };
std::cout << "(a-b)=" << static_cast<int>(a - b) << std::endl;
}
注:赋值运算符,就会将右面的数的类型,自动转化为左边的数据类型,如int a=c,即使c是float类型,也会转化为int类型,但是可能会丢失数据精度,如c=550.25f,强制转化以后就会变为550
3)计算数据类型长度
类型占用内存=sizeof(类型)
#include <iostream>
int main()
{
unsigned int a{ 10025 };
long long b{ 237189372198 };
float c{ 3718392.31782 };
std::cout << "long long的大小:" << sizeof(long long) << std::endl;
std::cout << "变量a占用的大小:" << sizeof(a) << std::endl;
std::cout << "变量c占用的大小:" << sizeof(c) << std::endl;
}
6、进制转化
1)将十进制数转换为其他进制数
将要转化的十进制数除以要转化的目标进制数,得到商和余数,商如果大于目标进制数,那么继续用商除以目标进制数,重复只到商小于目标进制数,将得到的最后的商和历次相除的余数连接起来,就是转化后的目标进制数
2)其他进制转化为十进制
从最高位依次计算每一位数字和当前进制数与该为位序减一次方的乘机,最后将各位的成绩相加。
①0b1111010111=1*2(10-1)+1*2(9-1)+1*2(8-1)+1*2(7-1)+0*2(6-1)+1*2(5-1)+0*2(4-1)+1*2(3-1)+1*2(2-1)+1*2(1-1)
②01727=1*8(4-1)+7*8(3-1)+2*8(2-1)+7*8(1-1)
③0x3D7=3*16(3-1)+D*16(2-1)+7*16^(1-1)
3)16进制和8进制转2进制
①16进制数,一个数转化为4个二进制
②8进制数,一个数转化为3个二进制数
7、"麟江湖"激活游戏
(1)设计要求
(2)设计
#include <iostream>