一、初始化的坑之忽略变量初始化
在C++中,变量的初始化非常重要。如果没有正确初始化变量,在使用过程中可能会导致未定义的行为或者逻辑错误。特别是对于基本数据类型和指针类型的变量,一定要注意初始化。在声明变量的同时,可以用赋值操作符将其初始化,也可以在声明之后再进行初始化操作。

例如,以下代码展示了一个忽略初始化的坑:

int i; // 未初始化的整型变量
int j = i + 1; // 使用未初始化的变量进行计算
std::cout << j << std::endl;

在这个例子中,变量i没有被初始化,它的值是未定义的。因此,在进行计算时,结果也是未定义的。正确的做法是在声明i的同时进行初始化,或者在使用i之前进行初始化操作。

二、初始化的坑之字符数组缺少字符串终止符
在C++中,字符数组(包括字符串)必须以字符串终止符'\0'结尾。如果忽略了字符串的终止符,在对字符串进行操作时可能会导致缓冲区溢出或者内存访问错误。因此,在对字符数组进行初始化时必须注意加上字符串终止符。

以下是一个没有添加字符串终止符的例子:

char str[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有添加终止符的字符串
std::cout << str << std::endl;

在这个例子中,字符数组str的长度是5,但是没有添加字符串终止符。当尝试将其打印输出时,由于缺少终止符,输出的结果是未定义的,可能是乱码。正确的做法是在声明字符数组时,添加字符串终止符,或者使用字符串字面量初始化字符数组。

三、初始化的坑之浮点数的精度丢失
在C++中,浮点数类型(float和double)使用二进制表示,因此无法精确地表示一些十进制数字。在进行浮点数运算时,可能会产生精度丢失的问题。特别是当浮点数进行比较时,可能会出现意想不到的结果。

以下是一个浮点数精度丢失的例子:

float a = 0.1;
float b = 0.2;
float c = 0.3;
if (a + b == c) {
    std::cout << "a + b equals c" << std::endl;
} else {
    std::cout << "a + b does not equal c" << std::endl;
}

在这个例子中,本应该输出"a + b equals c",但是实际输出的结果是"a + b does not equal c"。这是因为浮点数在二进制表示中存在精度问题,导致计算结果不精确。正确的做法是在浮点数比较时,使用一个误差范围来进行判断。