C++ Primer Plus(第6版):第三章 处理数据

请关注我!我将后续上传视频讲解!(保姆级程度)


一、变量命名规则

  • 变量名是数据的标识,需遵循严格规则,确保编译器可识别

    • 仅能包含字母、数字、下划线(_),不能含空格、连字符等特殊符号;
    • 首字符不能是数字;
    • 区分大小写(如ageAge是不同变量);
    • 不能使用C++关键字(如intdoubleif等);
    • 以下划线开头或双下划线开头的名称可能被编译器保留,不建议使用;
    • 名称长度无语法限制,建议简洁且表意(如用student_count而非sc)。
  • 合法/非法变量名示例

    cpp 复制代码
    // 合法变量名
    int poodle;       // 字母组成
    int my_stars3;     // 字母+数字+下划线
    int cost_of_trip;  // 下划线分隔单词
    int myEyeTooth;    // 驼峰命名法
    
    // 非法变量名
    int 4ever;        // 以数字开头
    int double;        // 使用关键字
    int honky-tonk;    // 含连字符
    int _Mystars3;     // 下划线开头(保留给实现)

二、整型 --- 整数类型

2.1 基本整型分类

类型 符号属性 存储宽度(最小要求) 取值范围示例(32位系统)
short(短整型) 有符号 16位 -32768 ~ 32767
int(整型) 有符号 至少与short相同 -2147483648 ~ 2147483647
long(长整型) 有符号 32位 -2147483648 ~ 2147483647
long long(C++11) 有符号 64位 -9223372036854775808 ~ 9223372036854775807
unsigned 类型 无符号 与对应有符号类型相同 0 ~ 对应有符号类型最大值×2+1
char(字符型) 取决于实现 8位 -128127(有符号)/0255(无符号)
bool(布尔型) - 1位 true(1)/false(0)

2.2 整型变量声明与初始化

  • 声明格式: 类型 变量名;,初始化支持多种方式(C++11新增列表初始化)。

  • 代码示例

    cpp 复制代码
    #include <iostream>
    #include <climits>  // 包含整型取值范围常量
    
    int main() {
        // 1. 基本声明与初始化
        short score = 95;          // 传统初始化
        int temperature(25);        // C++风格初始化
        long population{1000000};   // C++11列表初始化(推荐,禁止缩窄转换)
        unsigned int age = 30;      // 无符号整型,只能存储非负数
    
        // 2. C++11列表初始化特性
        int a{};         // 未指定值时初始化为0
        // int b{3.14};  // 错误:浮点数转整型是缩窄转换,列表初始化禁止
    
        // 3. 使用climits获取整型范围
        std::cout << "int最大值:" << INT_MAX << std::endl;       // 2147483647
        std::cout << "int最小值:" << INT_MIN << std::endl;       // -2147483648
        std::cout << "unsigned int最大值:" << UINT_MAX << std::endl; // 4294967295
        std::cout << "long long最大值:" << LLONG_MAX << std::endl; // 9223372036854775807
    
        return 0;
    }

2.3 字符型 char

  • char 实质: 其本质是整型,存储字符的ASCII编码,既可以表示字符也可以表示小整数。

    • 字符字面值用单引号括起(如'A''5');
    • 转义序列用于表示不可打印字符(如'\n'换行、'\t'制表符);
    • 可显式声明unsigned char(0~255)或signed char(-128~127)。
  • 代码示例

    cpp 复制代码
    #include <iostream>
    
    int main() {
        char ch1 = 'A';          // 存储'A'的ASCII码65
        char ch2 = 66;           // 存储ASCII码65对应的字符'B'
        char newline = '\n';     // 转义序列:换行符
        unsigned char ch3 = 200; // 无符号char,支持0~255
        
        std::cout << "ch1:" << ch1 << ",对应的ASCII码:" << static_cast<int>(ch1) << std::endl; // A 65
        std::cout << "ch2:" << ch2 << newline; // B(换行)
        std::cout << "ch3(无符号char):" << static_cast<int>(ch3) << std::endl; // 200
        
        // 转义序列示例
        std::cout << "Hello\tWorld!\n"; // 制表符分隔,换行
        std::cout << "She said \"Hello!\"\n"; // 转义双引号:She said "Hello!"
        
        return 0;
    }

2.4 布尔型 bool

  • bool 值: 其数值为true(逻辑真,对应整数1)和false(逻辑假,对应整数0),常用于条件判断。

  • 代码示例

    cpp 复制代码
    #include <iostream>
    
    int main() {
        bool is_ready = true;
        bool is_empty = false;
        
        std::cout << "true对应整数:" << is_ready << std::endl;  // 1
        std::cout << "false对应整数:" << is_empty << std::endl; // 0
        
        // 非零值隐式转换为true,零转换为false
        bool flag1 = 100;   // true
        bool flag2 = 0;     // false
        std::cout << "100转bool:" << flag1 << std::endl; // 1
        std::cout << "0转bool:" << flag2 << std::endl;   // 0
        
        return 0;
    }

三、常量定义 --- const限定符

  • 常量是值不可修改的量,C++推荐用const定义符号常量(优于C语言的#define),理由:

    • 明确类型,编译器可做类型检查;
    • 支持作用域限制(如局部常量、全局常量);
    • 可用于复杂类型(如数组、结构)。
  • 代码示例

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    // 全局const常量(整个文件可访问)
    const int MONTHS = 12;          // 一年的月份数
    const double PI = 3.1415926;    // 圆周率
    
    int main() {
        // 局部const常量(仅main函数内可访问)
        const int MAX_SCORE = 100;   // 满分
        // MAX_SCORE = 90;  // 错误:const常量不可修改
      
        // 用于数组长度(C++支持,C语言不支持)
        int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
      
        cout << "一年有" << MONTHS << "个月" << endl;
        cout << "圆的面积(半径5):" << PI * 5 * 5 << endl;
        cout << "10月有" << days[9] << "天" << endl;
      
        return 0;
    }

四、浮点型 --- 带小数的数字

4.1 浮点型分类

类型 存储宽度 有效位数(十进制) 取值范围(示例)
float 32位 6~7位 10⁻³⁸ ~ 10³⁸
double 64位 15~16位 10⁻³⁰⁸ ~ 10³⁰⁸
long double 80/96/128位 18~19位 10⁻⁴⁹³² ~ 10⁴⁹³²

4.2 浮点型声明与初始化

  • 浮点型字面值表示法: 标准小数点表示法(如3.14)和科学计数法(如3.14e2=314、1.23e-3=0.00123)。

  • 代码示例

    cpp 复制代码
    #include <iostream>
    #include <cfloat>  // 包含浮点型范围常量
    using namespace std;
    
    int main() {
        // 1. 声明与初始化
        float height = 1.75f;       // 后缀f表示float(默认是double)
        double weight = 68.5;        // double类型(推荐,精度更高)
        long double distance = 1.5e12L; // 后缀L表示long double
        
        // 2. 科学计数法
        double speed = 3.0e8;        // 3×10⁸(光速,单位m/s)
        double small = 1.23e-4;      // 1.23×10⁻⁴ = 0.000123
        
        // 3. 使用cfloat获取浮点型特性
        cout << "float有效位数:" << FLT_DIG << endl;       // 6
        cout << "double最大值:" << DBL_MAX << endl;       // 1.79769e+308
        cout << "long double最小正值:" << LDBL_MIN << endl; // 3.3621e-4932
        
        // 4. 输出格式控制(fixed表示固定小数点格式)
        cout.setf(ios_base::fixed);
        cout.precision(2);  // 保留2位小数
        cout << "身高:" << height << "m,体重:" << weight << "kg" << endl; // 1.75 68.50
        
        return 0;
    }

4.3 浮点型精度问题

  • 存储: 浮点型存储为二进制小数,部分十进制小数(如0.1)无法精确表示,会存在微小误差,需避免直接比较浮点数是否相等。

  • 代码示例

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    int main() {
        float a = 0.1f;
        double b = 0.1;
        double sum = 0.0;
        
        // 循环10次累加0.1,理论结果1.0
        for (int i = 0; i < 10; ++i) {
            sum += b;
        }
        
        cout.setf(ios_base::fixed);
        cout.precision(10);
        cout << "0.1的float表示:" << a << endl;  // 0.1000000015(存在误差)
        cout << "10次0.1累加结果:" << sum << endl; // 0.9999999999(非1.0)
        
        // 正确比较浮点数:判断差值小于极小值(如1e-9)
        if (abs(sum - 1.0) < 1e-9) {
            cout << "sum约等于1.0" << endl;
        }
        
        return 0;
    }

五、C++算术运算符

5.1 基本算术运算符

运算符 功能 注意事项
+ 加法 支持整型、浮点型
- 减法 支持整型、浮点型
* 乘法 支持整型、浮点型
/ 除法 整数除法截断小数;浮点除法保留小数
% 求模(取余) 仅支持整型,结果符号与被除数一致

5.2 运算符优先级与结合性

  • 优先级: */% 高于 +-
  • 结合性: 同优先级运算符从左到右计算(如a + b - c先算a+b);
  • 调整优先级: 可通过括号改变优先级(如(a + b) * c)。

5.3 代码示例

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 3;
    float c = 10.0f, d = 3.0f;
    
    // 1. 基本运算
    cout << "a + b = " << a + b << endl; // 13
    cout << "c / d = " << c / d << endl; // 3.333333(浮点除法)
    cout << "a / b = " << a / b << endl; // 3(整数除法,截断小数)
    cout << "a % b = " << a % b << endl; // 1(10除以3余1)
    cout << "(-10) % 3 = " << (-10) % 3 << endl; // -1(符号与被除数一致)
    
    // 2. 优先级与结合性
    int result1 = a + b * 2;  // 10 + 6 = 16(*优先级高于+)
    int result2 = (a + b) * 2; // 13 * 2 = 26(括号改变优先级)
    int result3 = a - b - 1;  // 10 - 3 -1 = 6(从左到右结合)
    cout << "result1 = " << result1 << ", result2 = " << result2 << endl;
    
    // 3. 复合赋值运算符(简化代码)
    int x = 5;
    x += 3;  // 等价于x = x + 3 → 8
    x *= 2;  // 等价于x = x * 2 → 16
    cout << "x = " << x << endl;
    
    return 0;
}

六、类型转换

6.1 自动类型转换 --- 隐式转换

  • 编译器自动触发,遵循 "低精度→高精度" 的安全转换规则:

    • 整型提升: boolcharshort 自动转为 int
    • 混合运算: 不同类型参与运算时,低精度类型转为高精度类型(如int+doubledouble);
    • 赋值转换: 右侧值转为左侧变量类型(可能丢失精度)。
  • 代码示例

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    int main() {
        // 1. 整型提升
        char ch = 'A'; // ASCII码65
        int sum = ch + 10; // char自动转为int,sum = 75
      
        // 2. 混合运算转换
        int a = 5;
        double b = 3.14;
        double product = a * b; // int转为double,结果15.700000
      
        // 3. 赋值转换(可能缩窄)
        int num = 3.99; // 浮点型转为整型,截断小数→3
        double pi = 3;  // 整型转为浮点型→3.000000
      
        cout << "sum = " << sum << endl;         // 75
        cout << "product = " << product << endl; // 15.7
        cout << "num = " << num << ", pi = " << pi << endl; // 3 3.0
      
        return 0;
    }

6.2 强制类型转换 --- 显式转换

  • 显式转换: 当自动转换不符合需求时(如高精度→低精度)。

    • C语言风格: (目标类型)值
    • C++风格: 目标类型(值)
    • 推荐方式: static_cast<目标类型>(值)(类型安全,仅支持相关类型转换)。
  • 代码示例

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    int main() {
        double price = 99.9;
        int discount = 10;
      
        // 1. C语言风格强制转换
        int int_price1 = (int)price; // 99(截断小数)
      
        // 2. C++风格强制转换
        int int_price2 = int(price); // 99
      
        // 3. static_cast(推荐)
        double final_price = price - static_cast<double>(discount); // 99.9 - 10.0 = 89.9
      
        // 4. 转换为字符型(利用ASCII码)
        int ascii = 66;
        char ch = static_cast<char>(ascii); // 'B'
      
        cout << "int_price1 = " << int_price1 << endl;       // 99
        cout << "final_price = " << final_price << endl;     // 89.9
        cout << "ascii=" << ascii << " 对应的字符:" << ch << endl; // 66 B
      
        return 0;
     }

6.3 转换注意事项

  • 避免将大值转为小类型(如long longshort),可能导致溢出;
  • 浮点型转整型会截断小数(非四舍五入);
  • static_cast不支持无关类型转换(如int*double*),比C风格转换更安全。

七、C++11新增特性:auto类型推断

  • C++11允许用auto关键字让编译器根据初始化值自动推断变量类型,简化代码(尤其适用于复杂类型)。

  • 代码示例

    cpp 复制代码
    #include <iostream>
    using namespace std;
    
    int main() {
        // auto根据初始化值推断类型
        auto num = 10;         // 推断为int
        auto pi = 3.14159;     // 推断为double
        auto ch = 'Z';         // 推断为char
        auto sum = num + pi;   // 推断为double(int+double)
    
        cout << "num类型:int,值:" << num << endl;
        cout << "pi类型:double,值:" << pi << endl;
        cout << "sum类型:double,值:" << sum << endl;
    
        // 注意:auto必须初始化(否则无法推断类型)
        // auto x;  // 错误:未初始化,无法推断类型
    
        return 0;
    }
相关推荐
拾贰_C1 小时前
[Python | pytorch | torchvision ] models like ResNet... 命名变量说明
开发语言·pytorch·python
CC.GG2 小时前
【C++】AVL树
java·开发语言·c++
CoderCodingNo2 小时前
【GESP】C++四级真题 luogu-B4416 [GESP202509 四级] 最长连续段
开发语言·c++·算法
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展
⑩-2 小时前
Java四种线程创建方式
java·开发语言
月光在发光2 小时前
22_GDB调试记录(未完成)
java·开发语言
222you2 小时前
SpringAOP的介绍和入门
java·开发语言·spring
程序员zgh2 小时前
代码重构 —— 读后感
运维·c语言·开发语言·c++·重构
liulilittle2 小时前
moodycamel::ConcurrentQueue 清空队列的方法论
开发语言·c++