文章目录
前言
变量基本上是所有编程语言的基础,是构建项目的基础。
下面的代码就是声明了一个变量:
// int就是变量的类型
// num就是变量名
// 0就是num的初始值
int num = 0;
为了便于记忆和理解,将类型和变量名类比一下:
- 可以设想成一个木箱,木箱里面装着物品。木箱就是变量名,而这个物品就是数据。
- 木箱装着什么品种的物品,比如苹果,梨子,香蕉,对应的就是变量的类型,int,short,long类型。
一.变量名
对于C++变量名有以下的命名规则(这里直接搬运C++ Primer Plus 第6版 中文版 3.1.1的内容)
- 在名称中只能使用字母字符,数字,下划线(_)
- 名称中的第一个字符不能是数字
- 区分大写字符和小写字符(例如:int A和int a是两个不同的变量名)
- 不能将C++关键字用作名称
- 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。(说人话就是最好不要使用类似于_time_stop,_Donut的组合做为变量名)
- C++对于名称的长度没有限制,名称中所有的字符都有意义。但是有些平台有长度限制
一般的变量名可以写成类似"my_name"或者"myName"这样的,我个人习惯写成myName的形式。
二.变量类型
C++的变量类型有哪些呢?
基本数据类型
// 整型
int,short,long,long long
// 浮点型
float,double,long double
// 字符类型
char
// 布尔类型
bool
还有枚举、指针、数组、引用、类等等类型,这些类型会在后续逐步介绍的。
2.1 整型
整型有short,int,long,long long四种类型
#include<iostream>
int main() {
short var_short = 22;
int var_int = 123;
long var_long = 1234l; // 后缀l,表示long
long long var_long_long = 12345ll; // 后缀ll,表示long long
return 0;
}
2.1.1 初始化
#include<iostream>
int main() {
// 声明一个int类型的变量,但是不初始化
int var; // 不建议这样做
// 声明一个int类型的变量并且初始化为22
int var = 22;
return 0;
}
变量声明有两种方式,第一种只声明,不去初始化;第二种声明并且初始化。不要使用第一种方式,因为对于C++而言,如果你不去手动初始化,那么变量的值是一个随机的内存数据,对于Visual Studio会直接报错。
error C4700: 使用了未初始化的局部变量“var”
所以不同于Java的自动初始化,对于C++你申明了一个变量,一定要记得对于变量一定要手动初始化。
2.1.2 取值范围
对于int,short,long,long long类型在32为操作系统上,最大的值是多少,最小的值是多少呢?它们占用的内存大小是多少呢?
整型占用的大小,参考C++ Primer Plus 第6版 中文版 3.1.3的内容:
- short至少16位
- int至少与short一样长
- long至少32位,且至少与int一样长
- long long至少64位,且至少与long一样长
不同的系统占用的内存大小是不一样的,那么我们该如何得知当前系统类型占用的内存大小呢?可以使用sizeof()来获取占用的内存大小。
#include<iostream>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
std::cout << sizeof(int) << std::endl;
std::cout << sizeof(short) << std::endl;
std::cout << sizeof(long) << std::endl;
std::cout << sizeof(long long) << std::endl;
return 0;
}
输出结果:
4
2
4
8
那么最大值和最小值该如何确定呢?同样可以使用C++提供的工具climits和cstdint(C++11)里面的宏常量来确定。
参考API地址:C++ 标准库头文件其中的数值极限
#include<iostream>
#include<climits>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
std::cout << "short最小值: " << SHRT_MIN << std::endl;
std::cout << "short最大值: " << SHRT_MAX << std::endl;
std::cout << "int最小值: " << INT_MIN << std::endl;
std::cout << "int最大值: " << INT_MAX << std::endl;
std::cout << "long最小值: " << LONG_MIN << std::endl;
std::cout << "long最大值: " << LONG_MAX << std::endl;
std::cout << "long long最小值: " << LLONG_MIN << std::endl;
std::cout << "long long最大值: " << LLONG_MAX << std::endl;
return 0;
}
输出结果:
short最小值: -32768
short最大值: 32767
int最小值: -2147483648
int最大值: 2147483647
long最小值: -2147483648
long最大值: 2147483647
long long最小值: -9223372036854775808
long long最大值: 9223372036854775807
2.1.3 数据类型溢出
当你使用某个类型的数据的时候,已经达到该数据类型最大值或者最小值了,但是你还继续增大或者减小该数据,会导致该数据达到反向的最大值或者最小值。
不废话,直接上代码:
#include<iostream>
#include<climits>
int main() {
int max_var = INT_MAX;
std::cout << "int最大值: " << max_var << std::endl;
max_var = max_var + 1; // 模拟溢出
std::cout << "int最大值溢出: " << max_var << std::endl;
int min_var = INT_MIN;
std::cout << "int最小值: " << min_var << std::endl;
min_var = min_var - 1; // 模拟溢出
std::cout << "int最小值溢出: " << min_var << std::endl;
return 0;
}
输出:
int最大值: 2147483647
int最大值溢出: -2147483648
int最小值: -2147483648
int最小值溢出: 2147483647
数据类型溢出的代码,告诫我们在处理基本数据类型的时候要考虑边界问题的判断,防止溢出的情况出现。
2.1.4 无符号类型
无符号类型就是在int,short,long,long long四种整型都有无符号类型unsigned,例如short类型。
#include<iostream>
#include<climits>
int main() {
unsigned short var = USHRT_MAX;
std::cout << var << std::endl;
var = var + 1; // 模拟溢出
std::cout << var << std::endl;
return 0;
}
输出:
65535
0
原先的short类型是-32768到+32767,无符号类型short牺牲了负数,只取正数,范围是0~65535,无符号(unsigned)类型只表示正数
2.2 浮点型
浮点数类型主要是float,double,long double,它们和整型的区别是带小数点的,代码如下:
#include<iostream>
#include<climits>
int main() {
float var_f = 1.234f;
float var0_f = 3.14e+5; // 3.14乘以10000,科学计数法
double var_d = 2.345;
long double var_ld = 2.365234;
std::cout << var0_f << std::endl;
return 0;
}
2.2.1 取值范围
#include<iostream>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
std::cout << sizeof(float) << std::endl;
std::cout << sizeof(double) << std::endl;
std::cout << sizeof(long double) << std::endl;
return 0;
}
输出:
4
8
8
2.2.2 最大值和最小值
float,double,long double的最大值和最小值:
#include<iostream>
#include<cfloat>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
std::cout << "float最小值: " << FLT_MIN << std::endl;
std::cout << "float最大值: " << FLT_MAX << std::endl;
std::cout << "double最小值: " << DBL_MIN << std::endl;
std::cout << "double最大值: " << DBL_MAX << std::endl;
std::cout << "long double最小值: " << LDBL_MIN << std::endl;
std::cout << "long double最大值: " << LDBL_MAX << std::endl;
return 0;
}
输出:
float最小值: 1.17549e-38
float最大值: 3.40282e+38
double最小值: 2.22507e-308
double最大值: 1.79769e+308
long double最小值: 2.22507e-308
long double最大值: 1.79769e+308
2.3 字符型
字符型则是char,代码如下:
#include<iostream>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
char ch0 = 'a';
char ch1 = 'A';
char ch2 = 97;
char ch3 = 65;
std::cout << ch0 << std::endl;
std::cout << ch1 << std::endl;
std::cout << ch2 << std::endl;
std::cout << ch3 << std::endl;
return 0;
}
输出:
a
A
a
A
重点在于ch2和ch3,char类型的数据可以赋值整数,而97和65在ASCII里面代表的就是a和A。通过char类型的这个特性,对于某些用到char类型的算法题目,可以用整数型配合加减来解决。
#include<iostream>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
char ch = 97;
for (int i = 0; i <= 25; i++) {
std::cout << ch << std::endl;
ch = ch + 1;
}
return 0;
}
2.4布尔型
布尔类型很简单,就两个值。0和非0,0代表false,非0(一般用1)代表true。
#include<iostream>
int main() {
// windows 10,Visual Studio 2022,Debug模式,x86
bool flag0 = true;
std::cout << flag0 << std::endl;
bool flag1 = false;
std::cout << flag1 << std::endl;
return 0;
}