C#里:Ep1:for(int i=0;i<10;i++)
Console.WriteLine(i.ToString());------------------------
Ep2:for(int i=0;i<10;++i)
Console.WriteLine(i.ToString());===================================Ep1和Ep2的执行结果完全一致,请问C#里 i++和++i到底什么区别? 可以用一个像上面一样简单的例子来体现一下么? 谢谢。也许很多人都不清楚,也许只有我不清楚。。
Console.WriteLine(i.ToString());------------------------
Ep2:for(int i=0;i<10;++i)
Console.WriteLine(i.ToString());===================================Ep1和Ep2的执行结果完全一致,请问C#里 i++和++i到底什么区别? 可以用一个像上面一样简单的例子来体现一下么? 谢谢。也许很多人都不清楚,也许只有我不清楚。。
Ep1: for(int i=0;i <10;)
Console.WriteLine((i++).ToString()); ------------------------
Ep2: for(int i=0;i <10;)
Console.WriteLine((++i).ToString());
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication21
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
int a= ++i;
Console.WriteLine(a.ToString());
}
Console.WriteLine("-----------------------");
for (int i = 0; i < 10; i++)
{
int a=i++;
Console.WriteLine(a.ToString());
}
}
}
}
你这样看看有没有什么差别
++i是先+1,然后再用对吧?那为什么我开始的两个Ep里执行效果是一样的呢?
(++i).ToString()理解为: i++;i.ToString();
只有放在表达式里才有区别,i++是自增前参与表达式运算,而++i是自增后参与表达式运算
而我下面的WriteLine里也就是输出了一下,并未真正使用i++或++i
C++说明是从C进化而来的语言,包含所有C的功能,而且加入了更多新的内容。
++C说明完全变成另外的东西了,而这东西的内容是C语言和一部分新内容的集合,凭空出来的,以前从未存在过,这显然违背了"C++"语言的的本质。正如++i和i++,前者是(i+1),是个以前不存在的东西;后者是i=i+1,i自己的内容更新了。
在你的例子里结果虽然是一样的,但是用++i时处理器在每次循环的时候少做一项工作:i=i+1,当循环子是int的时候当然看不出差别,可如果是个对象呢?用i++的对性能的影响是很大嘀!一点拙见,阐述的好外行啊
有关于i++和++i效率的阐述 可以继续 我暂时不结,方便更多的人学习到这些细节性的东西
几乎所有现代编译器都有这种简单的优化功能。在 Windows 下,当然是 Microsoft 的编译器了。
class Program
{
static int x;
static void Main()
{
Bar();
Foo();
}
static void Bar()
{
for (int i = 0; i < 5; i++) x = i;
}
static void Foo()
{
for (int i = 0; i < 5; ++i) x = i;
}
}
编译为 program.exe 后,用 ildasm 反汇编,结果如下:
.method private hidebysig static void Bar() cil managed
{
// 代码大小 24 (0x18)
.maxstack 2
.locals init (int32 V_0,
bool V_1)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: br.s IL_000f
IL_0005: ldloc.0
IL_0006: stsfld int32 Program::x
IL_000b: ldloc.0
IL_000c: ldc.i4.1
IL_000d: add
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ldc.i4.5
IL_0011: clt
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brtrue.s IL_0005
IL_0017: ret
} // end of method Program::Bar.method private hidebysig static void Foo() cil managed
{
// 代码大小 24 (0x18)
.maxstack 2
.locals init (int32 V_0,
bool V_1)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: br.s IL_000f
IL_0005: ldloc.0
IL_0006: stsfld int32 Program::x
IL_000b: ldloc.0
IL_000c: ldc.i4.1
IL_000d: add
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ldc.i4.5
IL_0011: clt
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brtrue.s IL_0005
IL_0017: ret
} // end of method Program::Foo
不需要看懂,你只要比较一下,两段代码,除了方法名 Bar 和 Foo 不一样外,其他的地方一模一样,就能说明问题了。
for(表达式1;表达式2;表达式3)
{
表达式4;
}
表达式1:只在第一次运行时执行一次
1、执行表达式2,成立,则执行表达式4,
2、执行表达式3;
3、转到1
对于这里的i++和++i来说结果都是一样的,都是每次循环结束后i的值自增1
http://topic.csdn.net/u/20090731/22/e91059c5-077c-405f-855c-01e5655d9c7f.html?69438
因为当for中间符合条件的时候,就输出了,而后面的i++ 和++i都没有执行之后并不是输出的结果,不信你可以在for循环外面再次输出i!!这样你就清楚了问题
Console.WriteLine(i.ToString()); ------------------------
Ep2: for(int i=0;i <10;++i)
Console.WriteLine(i.ToString()); ===================================
和
Ep1: for(int i=0;i <10;)
Console.WriteLine(i.ToString());
i++
------------------------
Ep2: for(int i=0;i <10;)
Console.WriteLine(i.ToString());
++i;
===================================
是完全一样的,1,3楼的同志的代码显示与楼主的不一致了!