趣谈 i++ ++i i-- --i

给大家介绍几个自增自减运算符的小例子,希望大家对其分析有所帮助,

i++、++i 的区别:如果做为单独的一条语句它们没有区别,结果都一样;

                                其他情况则有区别:如 int i = 2;int b;  b = i++; 和另一种情况b = ++i;是完全不一样的,b=i++,结果是b=2,i=3;   而b=++i;结果是b=3,i=3.由此可以看出它们之间的区  

                                                                    别,一个是先赋值再计算,另一个则是先计算再赋值。

i--,--i 同样也是这个道理。


一、第一个小例子

/*VC  、turboc3.0  、 visual Studio 中结果都一样*/ 

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    int c;
  

    c = (a++) + (b++) + 3; /*即:首先 c = a + b + 3; 然后 a++,b++*/

    printf("a = %d  b = %d  c = %d\n",a,b, c);
    
}


二、第二个小例子

/*VC  、turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    int c;

    c = (++a) + (++b) + 3; /*即:首先 ++a,++b ; 然后 c = a + b + 3*/

    printf("a = %d  b = %d  c = %d\n",a,b ,c);
    
    return 0;
}


三、第三个小例子


/*turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    
    /*turboc3.0  、 visual Studion 中结果都一样
    1、首先计算:++a,++a,++a;
    2、在计算:a = 4 + 4 + 4;
    3、最后:a = 12.
    */
    a = (++a) + (++a) + (++a);

    printf("a = %d\n",a);
    
    return 0;
}


/*VC 中测试*/

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 1;
    
    /*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
    1、首先计算:++a,++a
    2、再计算  a = 3 + 3 + (++a);
    3、再计算  ++a;(注意此时的a=3)

     4、再计算 a = 3 + 3 + 4;

     5、最后 a = 10

       */
    a = (++a) + (++a) + (++a);

    printf("a = %d\n",a);
    
    return 0;
}


四、第四个小例子

/*VC  、turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b;

    /*
    1、首先 b = 1 + 1 + 1
    2、然后 a++,a++ ,a++
    3、结果 b = 3,a = 4
    */
    b = (a++) + (a++) + (a++);

    printf("a = %d  b = %d\n",a,b);
    
    return 0;
}


五、第五个小例子

/*VC  、turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b;

    /*在Visual Studio中的测试,注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
    1、首先 ++a,++a;
    2、然后 b = 3 + 3 + 3;(注意这里a++的a不是最原始的a,而是经过++a计算后的a)
    3、然后 a++;
    4、结果 a = 4,b = 9
    */
    b = (++a) + (++a) + (a++);

    printf("a = %d  b = %d\n",a,b);
    
    return 0;
}


六、第六个小例子

/*turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b;

    /*注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
    1、首先 ++a,++a;
    2、然后 b = 3 + 3 + 3;(注意这里a++的a不是最原始的a,而是经过++a计算后的a)
    3、然后 a++;
    4、结果 a = 4,b = 9
    */
    b = (++a) + (a++) + (++a);

    printf("a = %d  b = %d\n",a,b);
    
    return 0;
}


/*VC 中测试*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b;

    /*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
    1、首先 ++a
    2、然后 b = 2 + 2 + (++a)
    3、然后 ++a;
    4、然后 b = 2 + 2 + 3;

    5、最后 a = 4,b = 7

    */
    b = (++a) + (a++) + (++a);

    printf("a = %d  b = %d\n",a,b);
    
    return 0;
}


七、第七个小例子


/*VC 中测试*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    int c;

    /*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
    1、首先 c = 1 + 2 + 3 + (++a) + (++b)
    2、再计算 ++a , ++ b
    3、再计算  c = 1 + 2 + 3 + 2 + 3
    4、结果:a = 3,b = 4,c = 11
    */
    c = (a++) + (b++) + 3 + (++a) + (++b);

    printf("a = %d  b = %d  c = %d\n",a,b ,c);
    
    return 0;
}


/*turboc3.0  、 visual Studio 中结果都一样*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    int c;

    /*注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
    1、首先 ++a,++b;
    2、在计算 c = 2 + 3 + 3 + 2 + 3;
    3、再计算:a++,b++;
    4、结果:a = 3,b = 4,c = 13
    */
    c = (a++) + (b++) + 3 + (++a) + (++b);

    printf("a = %d  b = %d  c = %d\n",a,b ,c);
    
    return 0;
}


最后几点注意事项:

1、可以因为编译器不一样在表达式求值时,结果可能有些差别,所以尽量在表达式中少用;


2、自增、自减运算符要比赋值运算符效率高(因为底层可以用一条汇编指令即可完成,如i++,对于汇编 inc i,而i = i + 1对应的汇编指令相应要多一些);


3、自增、自减运算符只能用于变量,不能用于常量和表达式(就是一个值),如:2++,(a+b)++非法;


4、++ 和 -- 的优先级要高于算术运算符,结合性“从右向左”,如:-a++ 相当于 -(a++);


5、一般自增、自减运算符通常用于循环控制变量和指针变量当中。


                               


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值