首先明确a++,和++a的区别:
a++:表达式执行完后进行++运算;
++a:先进行++运算在执行表达式;
这是最本质的区别,不用担心,接下来的例子我会详细介绍,博文特点,以代码为主,废话为辅。
我们常见的 b = a++; b = ++a,下面给出代码 是在C-FREE5.0环境下编写的例子代码:
/*
测试++运算符
*/
#include "stdio.h"
int main()
{
int a,b;
a = 0;
b = 1;
/*测试a++类型 */
/*
既然a++必须在完成表达式后才能进行自增 那么
下面例子就是先对a赋值 因此a = b = 1 然后b自增(++)b=2
很好理解对不对
*/
a = (b++) ;
printf("例1-1:a = %d b = %d\n",a,b);
/*
同样道理 a++必须在完成表达式之后才能自增
那么我们将先进行表达式 也就是a赋值操作 而两个b++都必须
在完成表达式后进行,因此 a = 1+1; 然后b进行2次自增 也就是++操作
b=3
*/
b = 1 ;
a = (b++) + (b++) ;
printf("例1-2:a = %d b = %d\n",a,b);
/*
这样和上面一样 先进行表达式 赋值操作 a =1+1+1 然后进行3次自增操作
b=4 很好理解是不是? 强调下 关键就是 先完成表达式 后进行自增!
注意:不是所有的编译器都这样。
*/
b = 1 ;
a = (b++) + (b++) + (b++) ;
printf("例1-3:a = %d b = %d\n",a,b);
/*测试++a*/
/*
这里则是++a操作 先进行自增 后完成表达式
那么++b 操作之后 b=2 然后赋值 a = b = 2
*/
b = 1 ;
a = (++b) ;
printf("例2-1:a = %d b = %d\n",a,b);
/*
这里也是一样 先进行++b操作 后完成表达式 强调下
是完成2个++b操作后 才进行赋值 因此两次++b操作后
b=3 将替换掉两个(++b) 因此 a= 3+3=6
这里需要你在细细品味下 好茶得慢慢品不是吗
看懂了 别急着觉得全明白了 很抱歉告诉你 不是的!
*/
b = 1 ;
a = (++b) + (++b) ;
printf("例2-2:a = %d b = %d\n",a,b);
/*
按照前面所说 这里应该先进行3次++b ,b=4 然后替换掉
所有的++b 因此 a= 4+4+4 =12 。但是输出结果却是10.
当初我也迷糊了,后来想了下 应该是这样的,先进行前面两个
++b操作 b=3替换掉前面两个++b 因此 a=3+3+(++b) 这时候b=3
还有一个++b操作要进行 那么b=4 替换掉(++b) a=3+3+4 =10
好了 在细细思考下 到这里就全一样了
*/
b = 1 ;
a = (++b) + (++b) + (++b) ;
printf("例2-3:a = %d b = %d\n",a,b);
/*
总结下 在c-free5.0中 前面两个++b操作是要完成后才能两个一起替代++b
之后还有++b 则是来一个替换一个 而非进行全部++b操作之后 一起替代
a = 3+3+4+5=15
*/
b = 1 ;
a = (++b) + (++b) + (++b) + (++b);
printf("例2-3:a = %d b = %d\n",a,b);
}
结果:
Hey man :别急着下结论 在不同的编译器都不一样哦 例如下面
MAC OSX xcode6.1 playground
xcode 里 可是来一个++就替换掉一个。。。。自己感悟下。不懂请留言