这篇笔记我们对C++中变量、常量的使用以及常用数据类型进行介绍。
C++中,变量其实就是给一段内存空间起的名字,我们通过这个名字可以操作这段内存空间。变量的值可以通过代码修改,而常量则是我们在代码层面规定为不可变的值,对常量的修改将在编译阶段抛出错误。
下面例子代码中,a
、b
、sum
是3个变量。
#include <iostream>
int main() {
int a = 10;
int b = 20;
int sum = a + b;
std::cout << sum << std::endl;
return 0;
}
上面代码中,实际上a
、b
、sum
都不会变,因此更好的写法是使用const
将其定义为常量。
#include <iostream>
int main() {
const int a = 10;
const int b = 20;
const int sum = a + b;
std::cout << sum << std::endl;
return 0;
}
常量不可以被更改,下面代码中a
被定义为常量,不可以再次被赋值。
const int a = 10;
a = 20; // 错误,常量不可以改变
实际开发中,对于不变的量我们推荐优先考虑使用const
关键字定义为常量。将变量定义为常量有更好的可读性,让人一看就知道这个值不会被改变,这样做也可以告知编译器帮我们进行检查,防止变量被意外的修改。此外,由于常量在编译阶段就是已知的,编译器可以进行优化处理,例如采用内联替换常量值等方式,从而提升性能。
C++是一门静态类型的编程语言,在创建变量或常量时我们需要指定数据类型,便于程序运行时确定该位置要分配多少字节的内存。C++中主要包含以下几种数据类型。
整型:整型代表整数,常用的有short
、int
、long
、long long
等类型。除了以上4种,我们还可以使用unsigned
类型无符号整型,无符号整型不需要占用额外的一位表示符号,但不能表达负数。
数据类型 | 占用内存空间 | 取值范围 |
---|---|---|
short | 2字节 | -2^15 ~ 2^15-1 |
unsigned short | 2字节 | 0 ~ 2^16-1 |
int | 4字节 | -2^31 ~ 2^31-1 |
unsigned int | 4字节 | 0 ~ 2^32-1 |
long | Windows下占用4字节,Linux下32位程序占用4字节,64位程序占用8字节 | (平台相关) |
unsigned long | Windows下占用4字节,Linux下32位程序占用4字节,64位程序占用8字节 | (平台相关) |
long long | 8字节 | -2^63 ~ 2^63-1 |
unsigned long long | 8字节 | 0 ~ 2^64-1 |
定义整型写法如下。
int a = 10;
浮点型:浮点型可以表示带小数点的数字,根据精度可以分为单精度浮点数float
和双精度浮点数double
,两者区别在于有效数字范围不同,占用的内存空间也不同。
数据类型 | 占用内存空间 | 取值范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15-16位有效数字 |
实际开发中,对于一般的计算需求我们通常使用double
类型即可,这是因为现代桌面电脑或服务器使用FPU计算浮点数,这种情况下无论是float
还是double
性能几乎没有差别。然而如果涉及SIMD向量计算就不一定了,例如AVX指令集可以同时处理8个float
或4个double
,此时使用float
显然计算速度更快,此外GPU硬件通常也被设计为更适合处理float
,此时如果使用double
性能会非常低下。
C++代码中,单精度浮点数字面值结尾需要增加字母f
,以区分于双精度浮点数。
float f = 1.5f;
double d = 1.5;
字符型:字符型即char
类型,字面值使用单引号表示。字符型变量占用1字节,内部存储的是字符对应的ASCII码。
char c = 'a';
char
类型仅用于处理标准ASCII字符,对于中文等Unicode字符情况就复杂多了,C++标准库提供了wchar_t
类型处理宽字符,然而其具体所占内存大小是由实现定义的,可能是2字节也可能是4字节,对于宽字符,字符串、输入输出流、文件流等也都有一套单独的API。
布尔型:布尔型即bool
类型,该类型只有两个取值,即true
或false
。C++中的布尔类型占用1字节,本质上其实是0
和1
。
bool flag = true;
C++中我们可以使用两种字符串,C风格字符串和C++标准库字符串std::string
。C风格字符串用法和C语言一致,它本质就是一个以\0
结尾的char
数组。而C++标准库字符串是C++标准库内置的字符串类的对象,它提供了更多更易用的功能,我们通常只有在和C库交互、内存受限、或者有特殊性能需求时才需要使用C风格字符串。字符串字面值使用双引号包裹。
// C风格字符串
const char *cstr = "Hello, world!";
// C++标准库字符串
const std::string str = "Hello, world!";
注意:使用std::string
前需要引入相关头文件,即#include <string>
。
C++中我们可以使用sizeof
获取类型或变量所占的内存空间大小。sizeof
后面可以接一个变量或是类型,下面两种写法都是正确的。
int a = 10;
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(int) << std::endl;