运算符++的前缀、后缀和&的记录

C语言指针与自增运算
本文详细解析了C语言中指针与自增运算符的使用规则,包括前缀与后缀自增的不同行为及其对指针的影响。通过具体实例展示了不同组合下变量的变化过程,帮助读者深入理解这些概念。

现有代码如下:

在C语言中,*的优先级和前缀++是属于一个(结合方向为从右向左),比后缀的++以及–的优先级高(结合方向为从左向右)~

int a[5] = {1011121314};
int *p, *q, b;
p = a;

1.后缀++

p = a;
q = P++;

结果为:p指向a[1], q仍然指向a[0]后缀返回的是自增前的值。
2.前缀++

p = a;
q = ++p;

结果为:p指向a[1], q也指向a[1]前缀返回的是自增后的值。

3.*p++

p = a;
b = *p++;

p指向a[1], b的值为自增前的值即是a[0]即是10.

4. *(p++)

p = a;
b = *(p++);

结果同3,*和++的运算顺序为从右向左

5.*++p

p = a;
p = *++p.

p指向a[1],++p指向自增后的值,即p为a[1]的值,11。

6.*(++p)

p = a;
b = *(++p);

结果同5
7.++(*p)

p = a;
b = ++(*p);

p指向a[1], 只要有++它肯定就会变。b的值为a[0]加1后的值,因为是前缀,返回自增后的值。

8.++*p

p = a;
b = ++*p;

结果同7

总结一下原则:
前缀, 值为变化后,后缀, 值为变化前。

在C++中,建议除非必须,否则不使用后置版本的递增递减运算符

其原因是前置版本的递增运算符避免了不必要的工作,把加1后的值直接返
回改变了运算对象。与之相比,后置版本需要先存储自增前的值,以便返回未修改的值。这是一种浪费。

### 前置说明 在 C++ 中,`++` 是一种一元运算符,可以用于变量的自增操作。它可以分为 **前缀形式** **后缀形式** 两种用法。通过运算符重载技术,开发者可以在类中定义 `++` 的行为。 以下是关于如何在 C++ 编程中重载 `++` 运算符的具体方法及其示例代码: --- ### 自增运算符重载的核心概念 #### 前缀形式 (`++obj`) - 表达式的值是在执行加一之后的结果。 - 返回的是修改后的对象本身。 #### 后缀形式 (`obj++`) - 表达式的值是在执行加一之前的原始值。 - 需要返回一个临时的对象来表示未改变的状态。 为了区分这两种情况,在声明定义时会使用额外的参数——通常是无意义的整型参数列表 `(int)` 来标记这是后缀版本[^1]。 --- ### 示例代码展示 下面是一个完整的例子,演示了如何在一个简单的类中实现 `++` 运算符的重载: ```cpp #include <iostream> using namespace std; class Counter { private: int value; public: // 构造函数初始化计数器 Counter(int v = 0) : value(v) {} // 前缀 ++ 实现 Counter& operator++() { ++value; // 对成员变量进行增量操作 return *this; // 返回当前对象引用 } // 后缀 ++ 实现 (注意多了一个 int 参数) Counter operator++(int) { Counter temp = *this; // 创建并保存旧状态副本 ++(*this); // 调用前缀版完成实际增加逻辑 return temp; // 返回之前保存的老数据作为结果 } void showValue() const { cout << "Current Value: " << value << endl; } }; // 测试程序部分 int main(){ Counter c1(5); cout << "Before Prefix Increment:" ; c1.showValue(); ++c1; // 使用前缀++ cout << "\nAfter Prefix Increment:\n"; c1.showValue(); cout << "\nBefore Postfix Increment:"; c1.showValue(); c1++; // 使用后缀++ cout << "\nAfter Postfix Increment:\n"; c1.showValue(); return 0; } ``` 上述代码展示了如何分别处理前后缀的情况,并且每种情况下都提供了相应的解释[^2]。 --- ### 关键点解析 1. **前缀 vs 后缀** - 当用户调用 `++counter` 或者 `counter++` 时,编译器能够依据语法结构自动匹配到对应的重载函数[^3]。 2. **为什么后缀需要传入 int?** - 定义上区别开两者的关键在于签名差异;由于无法单纯靠名字区分同名不同语义的操作符,所以约定俗成地给后者附加了个假参表`(int)`以便于识别. 3. **效率考量** - 如果只关心性能而不考虑兼容性的话,则可能更倾向于仅提供前缀版本即可满足大部分需求场景下的应用。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值