变量和数据类型

这篇笔记我们对C++中变量、常量的使用以及常用数据类型进行介绍。

变量和常量

C++中,变量其实就是给一段内存空间起的名字,我们通过这个名字可以操作这段内存空间。变量的值可以通过代码修改,而常量则是我们在代码层面规定为不可变的值,对常量的修改将在编译阶段抛出错误。

下面例子代码中,absum是3个变量。

#include <iostream>

int main() {
    int a = 10;
    int b = 20;
    int sum = a + b;
    std::cout << sum << std::endl;
    return 0;
}

上面代码中,实际上absum都不会变,因此更好的写法是使用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++中主要包含以下几种数据类型。

整型:整型代表整数,常用的有shortintlonglong 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类型,该类型只有两个取值,即truefalse。C++中的布尔类型占用1字节,本质上其实是01

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>

sizeof

C++中我们可以使用sizeof获取类型或变量所占的内存空间大小。sizeof后面可以接一个变量或是类型,下面两种写法都是正确的。

int a = 10;
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(int) << std::endl;
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap