学习C语言也有年头了,前自增和后自增一直是我的心病,今天决心把它解决了,要不某天被小菜问倒可不好啊(我也是小菜),说干就干,上网查下资料先,看看前辈们能的经验教训,再结合我的调试和验证,写下如下内容:
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
例一:
#include<stdio.h>
int main()
{
int i = 3;
int j = 4;
i++;
++j;
printf("i = %d,j = %d\n",i,j);
return 0;
}
对于上述程序,大家应该不会有什么困惑,结果应该是i = 4,j = 5;下面对做一些改变
#include<stdio.h>
int main()
{
int i = 3;
int j = 4;
int a = i++;
int b = ++j;
printf("a = %d,b = %d\n",a,b);
return 0;
}
结果又是多少呢?这里就开始体现出++前置与后置的区别了,结果是a = 3,b = 5, 这就体现出了前自增和后自增的区别了;
后自增即i++,对于这条语句 int a = i++;先把i的值赋给a,再把i的值加1,所以执行完后 a = 3,i = 4;
前自增即++j,对于这条语句 int b = ++j; 先把j的值加1,在把j赋给b,所以执行完后,b= 5,j = 5;
这个道理很简单,如果再复杂一点,那么结果如何呢?
例二:
#include<stdio.h>
int main()
{
int i = 3;
int j = 4;
int a = i++ + i++;
int b = ++j + ++j;
printf("a = %d,b = %d\n",a,b);
return 0;
}
也许你会说,这还不简单,a = 6,b = 10,那么恭喜你答错了。。。。。。
答案应该是 a = 6,b = 12,
你是不是刚才还很清楚,这下又糊涂了,i++的理解应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6;而后i再自增2次,i=5;
对于++j这里不光要考虑前自增和后自增,还要考虑运算优先级问题,++j是先自增然后再参加其它运算,所以b=6+6=12。
类似的,如果再复杂一些呢?
例三:
#include<stdio.h>
int main()
{
int i = 3;
int j = 4;
int a = i++ + i++ + i++;
int b = ++j + ++j + ++j;
printf("a = %d,b = %d\n",a,b);
return 0;
}
结果是:a = 9,b = 19,这下又糊涂了,怎么才能拼凑出19呢?
对于a = i++ + i++ + i++;我们已经没有疑问了,++后置就是执行完整个表达式的其他操作后,然后才自增,上例中也得到了验证,但 b = ++j + ++j + ++j;又该如何理解呢?
原理表达式中除了预算法本身的优先级外,还有一个结合性问题。在++j + ++j + ++j;中,因为存在两个同级的+运算,根据+运算符的左结合性,在编译时,其实是先处理前面的(++j + ++j)这部分,然后再将此结果再和++j相加。所以b = 6+6+7=19;
这下你应该真的明白了吧,要不我们再来一个更复杂的来验证我们的结论。
例四:
#include<stdio.h>
int main()
{
int i = 3;
int j = 4;
int a = i++ + i++ + i++ + i++ + i++;
int b = ++j + ++j + ++j + ++j + ++j;
printf("a = %d,b = %d\n",a,b);
return 0;
}
还是上面的思路
a = 3+3+3+3+3 = 15;
b = 6+6+7+8+9 = 36;
当然答案也是对的。不过很少有人会写出这么变态的程序的,首先这种程序可读性差,再者也没有什么实际意义。
不过在结束之前,我还要在举一个例子,这是给我自己看的,我人吧有点笨,怕日后再掉这个陷阱里
例五:
#include<stdio.h>
int main()
{
int i = 3;
int a = i++ + ++i;
printf("a = %d\n",a);
return 0;
}
答案是 a = 8,原因我就不多解释了,聪明的你肯定可以弄明白吧。
注:以上结果及解释出自VC编译器,但对于++这个问题是和编译器的解析有关的,不同厂家可能理解不一致,因手头没有其他开发环境,暂无法做全面分析,本文只是为了说明++,--这运算符的一些特性,尤其是前置后置的区别这个问题。类似的问题如果有困惑,最好是写程序做试验解决,请勿生搬硬套