++i与i++进行加1的时刻性

先附上源代码:

#include <stdio.h>

void output1()
{
 int i = 5;
 printf("%d,%d\n",i++,++i);
}

void output2()
{
 int i = 5;
 printf("%d,%d\n",++i,i++);
}

void output3()
{
 int i = 5;
 printf("%d\n",++i+i++);
}

void output4()
{
 int i = 5;
 printf("%d\n",(i++)+(++i));
}

void output5()
{
 int i = 5;
 printf("%d\n",(i++)+i);
}

void output6()
{
 int i = 5;
 printf("%d\n",++i+i);
}

void output7()
{
 int i = 5;
 printf("%d,%d\n",i,++i);
}

void output8()
{
 int i = 5;
 printf("%d,%d\n",i,i++);
}

void main()
{
 output1();
 output2();
 output3();
 output4();
 output5();
 output6();
 output7();
 output8();
}

在这里,大家先别急着运行程序看结果,先自己想一下大概的输出,下面附出在vs6.0下的运行结果:

 

 

 

现在讲一下我对运行结果的分析:

(1)output1():首先要讲的是,printf函数是先计算后面的参数,估计是printf函数对参数进行从前到后的压栈,所以在出栈的时候后进先出,先处理后面的参数,知道了这个,那么结果6,6就不难得出了;

(2)output2():和output1()一样的道理;

(3)output3():对于++i+i++,对这个表达式进行分解,先进行++i运算,s=(++i)=6,而且之后i = 6;然后s+i++的算式大家应该都会计算,所以最终结果相当于6+6 = 12,printf结束之后i=7;

(4)output4():此函数需要和output5()对比着看,(i++)+(++i),先进行(i++)运算,s=(i++) = 5,但是之后i并没有立即加1变成6,而是需要等待程序的此次原子操作执行完成之后才能加1,在output4()中,原子操作是到此表达式中执行(++i)时,此时因为内存中必须要更新++i的值,所以在执行++i之前,上一步原子操作结束,i的值加1,i=6,然后执行++i,此时(++i) = 7;所以最终结果相当于5+7 = 12;

(5)output5():同output4(),不过函数中的输出时,原子操作为输出(i++)+i的结果之后才结束,所以在计算时,i的值都是5,所以最终结果相当于5+5 = 10;

(6)output6():这个是典型的++i的运算,结果相当于6+6 = 12;

(7)output7():原理在output1()中已经讲到,由于printf处理参数顺序的原因,导致结果为6,6;

(8)output8():原理在output4()和output5()中讲到

 

这只是个人观点,如果大家有疑问,欢迎评论~

posted on 2013-09-22 17:07  楠哥1991  阅读(610)  评论(0编辑  收藏  举报

导航