c语言中i++与++i的区别及运行效率

本文详细解析了C语言中i++与++i的使用差异,通过实例展示了两者在运算顺序上的不同,以及在自定义数据类型中效率表现的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在c语言我们会经常把i++与++i弄混淆。

i++    是先使用,再自加(其自加是在遇到结束标志时才会进行)

即a = i;i=i+1;

++i    是先自加,再使用

即 i=i+1; a= i;

例如以下程序:

#include <stdio.h>

int main()

{

int i = 2;

int num;

num = (++i)+(++i)+(++i)+(++i);

printf("%d%d\n",num,i);

return 0;

}

其输出结果为:num = 19; i = 6。

其运算过程是:num = 4+4+5+6 = 19

i = i+4=6

#include <stdio.h>

int main()

{

int i = 2;

int num;

num = (i++)+(i++)+(i++)+(i++);

printf("%d%d\n",num,i);

return 0;

}

其运行结果为:num = 8;i = 6。

其运算过程是:num = 2+2+2+2 =8

i = i+4=6

我们在遇到像这样的i++,++i之类的可以这样看,把i++看做常量,把++i看做变量

如:将i 初始化为2,func是一个函数func(++i,i++)的结果为func(4,2);

函数的传参是从右边开始的,首先把i++看做是常量,++i看做变量,i的初始值是2,所以i++的值为2,++i的值为i,然后执行i=i+1,i=i+1,i的最后结果是4,所以++i的值就是4,所以结果为func(4,,2)。像func(i++,++i)的结果就是func(3,4);首先i=i+1,i = 3,所以i++的值为3,++i的值为i,然后再执行i = i+1,i的值为4,所以结果为func(3,4)。

i++与++i的效率

是内建数据类型时,它们的效率差别不大(去除编译器优化的影响)。所以在这种情况下我们大可不必关心。
自定义数据类型(主要是指类)时,此时我们不需要再做很多汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须产生一个临时对象保存更改前对象的值并返回(实现过自定义类型++运算符定义的就知道),所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。

所以

内建数据类型的情况,效率没有区别。
自定义数据类型的情况,++i效率较高。





### C语言中 `for` 循环里的 `i++` 和 `++i` 的区别 在 C 语言中,`i++` 和 `++i` 都是用来实现变量自增的操作符。然而,它们的行为存在细微差别,尤其是在复杂的表达式或者特定上下文中会表现出不同的效果。 #### 基本概念 - **后置自增 (`i++`)** 表达式 `i++` 的含义是先返回变量 `i` 的当前值,然后再将 `i` 自增 1[^1]。 - **前置自增 (`++i`)** 表达式 `++i` 的含义是先将变量 `i` 自增 1,然后再返回其新的值[^1]。 #### 在 `for` 循环中的表现 虽然在简单的 `for` 循环结构中,`i++` 和 `++i` 的最终结果通常是相同的,但在更复杂的情况下可能会有所不同。以下通过具体代码来分析两者的表现: ##### 示例代码对比 ```c #include <stdio.h> int main() { int i; // 使用后置自增的情况 for (i = 0; i < 5; i++) { printf("Post-increment: %d\n", i); } printf("********************\n"); // 使用前置自增的情况 for (i = 0; i < 5; ++i) { printf("Pre-increment: %d\n", i); } return 0; } ``` 在这段代码中,无论是使用 `i++` 还是 `++i`,输出的结果都是完全一致的: ``` Post-increment: 0 Post-increment: 1 Post-increment: 2 Post-increment: 3 Post-increment: 4 ******************** Pre-increment: 0 Pre-increment: 1 Pre-increment: 2 Pre-increment: 3 Pre-increment: 4 ``` 这是因为 `for` 循环的更新部分(即第三部分)只关心变量的变化,而不涉及具体的返回值[^5]。 #### 复杂情况下的差异 当 `i++` 或 `++i` 被嵌套到更大的表达式中时,两者的差异就会显现出来。例如: ##### 示例代码 ```c #include <stdio.h> int main() { int i, a = 0, b = 0; // 后置自增的例子 for (i = 0; i < 5;) { a = i++; printf("i=%d, a=%d\n", i, a); } printf("********************\n"); // 前置自增的例子 for (i = 0; i < 5;) { b = ++i; printf("i=%d, b=%d\n", i, b); } return 0; } ``` 运行以上代码,得到如下输出: ``` i=1, a=0 i=2, a=1 i=3, a=2 i=4, a=3 i=5, a=4 ******************** i=1, b=1 i=2, b=2 i=3, b=3 i=4, b=4 i=5, b=5 ``` 在这个例子中可以看出明显的差异: - 对于 `a = i++`,`a` 接收到的是 `i` 自增之前的值。 - 对于 `b = ++i`,`b` 接收到的是 `i` 自增之后的值[^2]。 #### 总结 在普通的 `for` 循环中,`i++` 和 `++i` 并不会产生任何功能上的差异,因为循环本身并不依赖于这两个操作符的具体返回值。但是,在涉及到更大、更复杂的表达式时,`i++` 和 `++i` 的行为会有显著的不同。开发者应根据实际需求选择合适的版本以提高代码可读性和效率[^4]。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值