前自增和后自增

       学习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编译器,但对于++这个问题是和编译器的解析有关的,不同厂家可能理解不一致,因手头没有其他开发环境,暂无法做全面分析,本文只是为了说明++,--这运算符的一些特性,尤其是前置后置的区别这个问题。类似的问题如果有困惑,最好是写程序做试验解决,请勿生搬硬套




 

 

 

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值