在C语言中,使用++i和i++之间的区别是什么,在for循环的增量块中应该使用哪个?
当前回答
下面的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
其他回答
我假设你现在已经理解了语义上的差异(尽管说实话我想知道为什么 人们会问“运算符X是什么意思”的问题,而不是阅读, 你知道的,一本书或网络教程之类的。
不管怎样,至于用哪个,忽略性能的问题 即使在c++中也不太重要。这是你做决定时应该遵循的原则 使用哪一种:
用代码表达你的意思。
如果语句中不需要value-before-increment,就不要使用这种形式的操作符。这是一个小问题,但除非你的风格指南禁止这样做 版本完全赞成其他的(又名愚蠢的风格指南),你应该使用 最准确地表达你要做的事情的形式。
QED,使用预增量版本:
for (int i = 0; i != X; ++i) ...
你可以把它的内部转换看作是多条语句:
// case 1
i++;
/* you can think as,
* i;
* i= i+1;
*/
// case 2
++i;
/* you can think as,
* i = i+i;
* i;
*/
i++和++ I
这段小代码可能有助于从不同的角度来看待与已经发布的答案的差异:
int i = 10, j = 10;
printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);
printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);
结果是:
//Remember that the values are i = 10, and j = 10
i is 10
i++ is 10 //Assigns (print out), then increments
i is 11
j is 10
++j is 11 //Increments, then assigns (print out)
j is 11
注意之前和之后的情况。
for循环
至于在for循环的增量块中应该使用它们中的哪一个,我认为我们能做的最好的决定是使用一个很好的例子:
int i, j;
for (i = 0; i <= 3; i++)
printf (" > iteration #%i", i);
printf ("\n");
for (j = 0; j <= 3; ++j)
printf (" > iteration #%i", j);
结果是:
> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3
我不知道你怎么想,但我没有看到它的用法有任何不同,至少在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++ Post(After Increment)和 ++i Pre(增量前) Post if I =1,循环增量为1,2,3,4,n 如果I =1,循环会增加2 3 4 5 n