自增运算

本文详细解释了在C++中前置加一(++x)和后置加一(x++)运算符的执行顺序,并通过示例代码展示了它们在实际应用中的差异。理解这些差异对于编写高效且可预测的代码至关重要。

概念:

++x :x先运行++(+1)后,再去做其他运算。

x++:x先去做其他运算,最后再自己++(+1)。


【示例】

class A{
    int x=7;
    int y=++x + (x++ + x)
    System.out.println(y);
}
结果:25

运行详细步骤:

1.执行 ++x —> 此时x变为8(因为运算中的 x 都指向同一块内存,有新的值会被覆盖)

2. [x=8] 再运算(x++ +x)中的内容 —>值为 16

3.x++ 是做完其他运算,再 ++—>此时x变为9

4.最终输出:16 + 9




C++中,**指针**和**引用**的自运算(`++`)行为有本质区别,主要体现在**语法**和**底层操作**上。以下是详细分析: --- ### **1. 指针的自运算** 指针存储的是**内存地址**,自运算会基于指向类型的大小移动地址。 #### **关键特性** - **地址偏移**:`ptr++`会使指针移动`sizeof(*ptr)`字节。 - **可修改性**:指针本身是变量,可以重新赋值或自。 - **多级指针**:支持`int**`等多级间接访问。 #### **示例代码** ```cpp int arr[] = {10, 20, 30}; int* ptr = arr; // 指向arr[0] ptr++; // 移动到arr[1](地址加4字节,假设int为4字节) cout << *ptr; // 输出: 20 int** ptr_to_ptr = &ptr; // 二级指针 (*ptr_to_ptr)++; // 等价于ptr++ ``` #### **底层行为** - 若`ptr`是`int*`,`ptr++`等价于: ```cpp ptr = (int*)((char*)ptr + sizeof(int)); ``` --- ### **2. 引用的自运算** 引用是**别名**,自运算直接作用于被引用的对象,**无地址偏移**。 #### **关键特性** - **无独立内存**:引用必须绑定到已有变量,不能为`nullptr`。 - **语法糖**:`ref++`等价于被引用对象的自(如`int& ref = x; ref++`即`x++`)。 - **不可重新绑定**:引用一旦初始化,不能修改绑定的对象。 #### **示例代码** ```cpp int x = 10; int& ref = x; // 引用绑定到x ref++; // 等价于x++ cout << x; // 输出: 11 // int& ref2; // 错误:引用必须初始化 ``` #### **底层行为** - 编译器将`ref++`直接替换为被引用对象的操作,无额外地址计算。 --- ### **3. 核心区别** | **特性** | **指针** | **引用** | |------------------------|-----------------------------|-----------------------------| | **本质** | 存储地址的变量 | 对象的别名 | | **自操作** | 地址偏移(基于类型大小) | 直接修改被引用对象 | | **可空性** | 可为`nullptr` | 必须绑定有效对象 | | **重新绑定** | 可修改指向 | 不可重新绑定 | | **多级间接访问** | 支持(如`int**`) | 不支持 | --- ### **4. 常见误区与注意事项** #### **误区1:引用自会移动地址** - **错误理解**:认为`ref++`会像指针一样移动地址。 - **正确行为**:引用自仅作用于被引用对象,无地址变化。 #### **误区2:指针和引用自性能相同** - **事实**:引用自通常更高效(直接操作对象,无地址计算)。 #### **误区3:引用可替代指针** - **限制**:引用不能实现动态多态(如基类引用指向派生类对象需用指针)。 --- ### **5. 实际应用场景** #### **指针适用场景** - 需要动态内存管理(如`new`/`delete`)。 - 需要重新指向其他对象(如链表遍历)。 - 需要多级间接访问(如二维数组)。 #### **引用适用场景** - 函数参数传递(避免拷贝,如`void func(int& x)`)。 - 操作符重载(如`operator++`通常返回引用)。 - 保证非空且无需重新绑定的场景。 --- ### **6. 代码对比示例** ```cpp // 指针遍历数组 int arr[] = {1, 2, 3}; int* p = arr; for (int i = 0; i < 3; i++) { cout << *p++; // 先解引用,再移动指针 } // 引用修改对象 int a = 5; int& r = a; r += 10; // 直接修改a的值 cout << a; // 输出: 15 ``` --- ### **总结** - **指针**:操作地址,灵活但需手动管理。 - **引用**:操作对象,安全但功能受限。 - **选择原则**:需要重新绑定或空值检查时用指针;否则优先用引用提升代码可读性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值