在C语言中,使用++i和i++之间的区别是什么,在for循环的增量块中应该使用哪个?
当前回答
++i将增加i的值,然后返回增加后的值。 I = 1; J = ++i; (i = 2, j = 2) i++将增加I的值,但返回I被增加前的原始值。 I = 1; J = i++; (i = 2, j = 1)
对于For循环,两者都可以。++i似乎更常见,也许是因为这是K&R中使用的。
在任何情况下,遵循“优先选择++i而不是i++”的指导方针,您都不会出错。
这里有一些关于++i和i++的效率的评论。在任何非学生项目的编译器中,都不会有性能差异。您可以通过查看生成的代码来验证这一点,它们是相同的。
效率问题很有趣……以下是我试图回答的问题: 在C语言中i++和++i之间有性能差异吗?
正如@OnFreund指出的那样,对于c++对象是不同的,因为操作符++()是一个函数,编译器不知道优化掉一个临时对象的创建来保存中间值。
其他回答
++i增加值,然后返回该值。
i++返回值,然后使其递增。
这是一个微妙的区别。
对于For循环,使用++i,因为它稍微快一些。i++将创建一个被丢弃的额外副本。
简单地说,两者之间的区别在于步骤,请看下图。
例子:
int i = 1;
int j = i++;
j的结果是1
int i = 1;
int j = ++i;
j的结果是2
注意:在这两种情况下i的值都是2
下面的C代码片段说明了前后递增和递减操作符之间的区别:
int i;
int j;
增量运算符:
i = 1;
j = ++i; // i is now 2, j is also 2
j = i++; // i is now 3, j is 2
唯一的区别是变量的增量和运算符返回值之间的操作顺序不同。
这段代码及其输出解释了区别:
#include<stdio.h>
int main(int argc, char* argv[])
{
unsigned int i=0, a;
printf("i initial value: %d; ", i);
a = i++;
printf("value returned by i++: %d, i after: %d\n", a, i);
i=0;
printf("i initial value: %d; ", i);
a = ++i;
printf(" value returned by ++i: %d, i after: %d\n",a, i);
}
输出结果为:
i initial value: 0; value returned by i++: 0, i after: 1
i initial value: 0; value returned by ++i: 1, i after: 1
所以基本上++i返回的值是在它被加1之后,而i++返回的值是在它被加1之前。最后,在这两种情况下,i的值都会增加。
另一个例子:
#include<stdio.h>
int main ()
int i=0;
int a = i++*2;
printf("i=0, i++*2=%d\n", a);
i=0;
a = ++i * 2;
printf("i=0, ++i*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
i=0;
a = (i++) * 2;
printf("i=0, (i++)*2=%d\n", a);
return 0;
}
输出:
i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (i++)*2=0
很多时候是没有区别的
当返回值被赋给另一个变量时,或者当增量与应用操作优先级的其他操作一起执行时,差异很明显(i++*2不同于++i*2,以及(i++)*2和(++i)*2),在许多情况下它们是可互换的。一个经典的例子是for循环语法:
for(int i=0; i<10; i++)
有同样的效果吗
for(int i=0; i<10; ++i)
效率
预增量总是至少和后增量一样高效:事实上,后增量通常包括保留前一个值的副本,并可能添加一些额外的代码。
正如其他人所建议的,由于编译器优化很多次,它们同样有效,可能在这些情况下存在for循环。
要记住的规则
为了不混淆这两个运算符,我采用了下面的规则:
将运算符++相对于变量i的位置与++操作相对于赋值的顺序相关联
换言之:
++ before I表示必须在赋值之前进行递增; I之后的++表示必须在赋值之后进行递增:
这种差异可以通过下面这段简单的c++代码来理解:
int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;
推荐文章
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 如何在shell中为for循环添加前导零?
- 互斥实例/教程?
- 如何添加一个'或'条件在#ifdef
- extern关键字对C函数的影响
- 如果使用if-return-return或if-else-return?
- 转换Python程序到C/ c++代码?
- 为什么程序不是经常用汇编编写的?
- 有没有替换Windows (Visual C)的unistd.h ?
- 如何在for循环中注释类型?
- 使用gcc命令行从.c文件构建.so文件
- C多行宏:do/while(0) vs作用域块