i ++和++ i在循环中的区别?
在for
循环中, ++i
和i++
有区别吗? 它只是一个语法的东西?
一个++被称为后缀。
将1加1,返回旧值。
++ a被称为前缀。
将1加1,返回新值。
C#:
string[] items = {"a","b","c","d"};
int i = 0;
foreach (string item in items)
{
Console.WriteLine(++i);
}
Console.WriteLine("");
i = 0;
foreach (string item in items)
{
Console.WriteLine(i++);
}
输出:
1
2
3
4
0
1
2
3
foreach
和while
循环取决于您使用的增量类型。 对于下面的for循环,由于您不使用i的返回值,因此没有区别:
for (int i = 0; i < 5; i++) { Console.Write(i);}
Console.WriteLine("");
for (int i = 0; i < 5; ++i) { Console.Write(i); }
0 1 2 3 4
0 1 2 3 4
如果使用评估值,那么增量的类型变得很重要:
int n = 0;
for (int i = 0; n < 5; n = i++) { }
预增加++我增加i的值并评估为新增值。
int i = 3;
int preIncrementResult = ++i;
Assert( preIncrementResult == 4 );
Assert( i == 4 );
后递增i ++递增i的值并评估为原始非递增值。
int i = 3;
int postIncrementResult = i++;
Assert( postIncrementtResult == 3 );
Assert( i == 4 );
在C ++中,预增量通常是您可以使用的首选。
这是因为如果使用后增量,它可能要求编译器必须生成创建额外临时变量的代码。 这是因为被增量的变量的前一个值和新值都需要保存在某个地方,因为它们可能在被评估的表达式的其他地方被需要。
因此,至少在C ++中,可能会有性能差异,指导您选择使用哪一个。
当被增量的变量是用户定义的类型并带有重载的++运算符时,这主要只是一个问题。 对于原始类型(int等),没有性能差异。 但是,值得坚持前置增量操作符作为指导,除非后增加操作符肯定是需要的。
这里有更多的讨论:
https://web.archive.org/web/20170405054235/http://en.allexperts.com/q/C-1040/Increment-operators.htm
在C ++中,如果你使用的是STL,那么你可能会用循环迭代器。 这些主要覆盖了++运算符,所以坚持预增加是个好主意。 编译器会一直变得更聪明,而新版本可能会执行优化,这意味着没有性能差异 - 尤其是如果增加的类型在头文件中内联定义(正如STL实现一般),以便编译器可以看到该方法被执行,然后可以知道哪些优化是安全的执行。 即便如此,它仍然值得坚持预增量,因为循环会被执行很多次,这意味着很小的性能损失很快就会被放大。
在其他语言(如C ++)中,++运算符不能重载时,没有性能差异。 在循环中使用以推进循环变量,前后增量运算符是等效的。
更正:在C#中重载++是允许的。 看起来,虽然,与C ++相比,在C#中,不能独立重载前后版本。 所以,我假设如果在C#中调用++的结果没有被赋值给一个变量或者被用作复杂表达式的一部分,那么编译器会将++的前后版本降低到等效执行的代码。
在c#中,在for循环中使用时没有区别。
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }
输出与之相同的东西
for (int i = 0; i < 10; ++i) { Console.WriteLine(i); }
正如其他人指出的那样,当在一般情况下使用i ++和++时,我有一个微妙而显着的区别:
int i = 0;
Console.WriteLine(i++); // Prints 0
int j = 0;
Console.WriteLine(++j); // Prints 1
我++读取我的价值,然后增加它。
++我增加我的价值,然后读取它。
链接地址: http://www.djcxy.com/p/72253.html上一篇: Difference between i++ and ++i in a loop?
下一篇: Is there a performance difference between i++ and ++i in C++?