自增和自减运算

1、我们都知道自增运算符和自减运算符,如:i++ 和 ++i,i-- 和 i--。可能你会觉得这很简单,但是往往觉得简单的东西就越容易忽略它,下面举几个例子。

#include <stdio.h>  
  
int main()  
{  
    int num;  
    int i = 2;  
  
    num = (i++) + (++i) + (i++) + (++i);  
    printf("num = %d\n", num);  
  
    return 0;  
}  
  
执行结果:
[root@localhost 1109]# ./add_add   
num = 13  
结果是13,解答如下:

我们这里设i的初值为2,所以num = 3 + 3 + 3 + 4 = 13。

这里我要提到非常重要的一点,关于 i++ 与++i 的区别。i++是先使用 i 的值,再进行 i+1。而++i 是先进行 i+1,再使用 i 的值。这是它们的本质区别!


如果将 num 改成 i ,它的值又是多少? 我们用一个程序验证一下:

int main()  
{  
    int i = 2;  
  
    i = (i++) + (++i) + (i++) + (++i);  
    printf("i = %d\n", i);  
  
    return 0;  
}  
执行结果:
<pre name="code" class="html">[root@localhost 1109]# ./add_add   
i = 15  

下面分析一下,i 的自增和自减运算是相对于自身来讲的,这里也就是为什么表达式没有变,而 num 换成 i 之后,值加了2的原因。 i = 3 + 3 + 3 + 4  + 2  = 15。

 2、 

我们这里先讲一讲关于运算符优先级。首先自增、自减的优先级高,先进行自增和自减,然后再进行加法运算,结合方向自左至右,最后才是赋值运算。

例如:*p++    -->    由于++和*的优先级一样,不过它们的结合方向是自右向左。所有要先进行p++,然后再*p,最后p = p + 1。

*tab++ = *tmp++;  等效于*tab = *tmp; tab++;   tmp++;


下面如果用printf打印自增和自减运算,那结果又会变成什么样?

#include <stdio.h>  
  
int main()  
{  
    int i = 2;  
      
    printf("%d %d %d %d %d\n", i++, i++, ++i, ++i, i++);  
  
    return 0;  
}  
  执行结果:
<pre name="code" class="html">[root@localhost 1109]# ./add_add   
6 5 7 7 2  

这里出现这个结果的原因是 函数的传参是 自右向左 的,故按上面说的计算可得出该结果。

 

再看一个例子:

#include <stdio.h>  
  
int main()  
{  
    int i = 2;;  
  
    printf("%d %d %d %d %d\n", i++, ++i, i++, i++, ++i);  
  
    return 0;  
}  
  
[root@localhost 1109]# ./add_add   
6 7 4 3 7  
可以通过这两个例子发现有几个++i ,就有几个值相等,而且它们的值最大。可以总结出一句话来:i++被替换成数值,而++i 被替换成变量名。

在第一个例子中,从最右边开始,2(3)  -->  i(4)  -->  i(5)  -->  5(6)  -->  6(7)。右边括号中的值是使用结束之后的值,所以最后 i = 7,即答案为6  5  7  7  2

在第二个例子中,从最右边开始,i(3)  -->  3(4)  -->  4(5)  --> i(6)  -->  6(7)。右边括号中的值是使用结束之后的值,所以最后 i = 7,即答案为6  7  4  3  7

那自增、自减什么时候算作是使用结束呢?

答案是遇到逗号(,)、分号(;)、圆括号()算使用结束。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值