• x = x + 1; && x += 1; & x++;


      首先,进入正题之前我想先说明一下题目的含义,x = x + 1; 和 x += 1;之间有两个“&”,而x += 1;和x++;之间只有一个“&”,因为我这篇文章想先介绍x = x + 1;和 x += 1;之间的一点异同,然后再介绍x = x + 1; x += 1; 和 x++;三者之间的区别!

      @1:x = x + 1; & x += 1;

      以两段代码举例说明:

      #1:

    View Code
    short x = 1;
    x = x + 1;

      #2:

    View Code
    short x = 1;
    x += 1;

      可能你已经注意到了#1代码不会编译通过,因为short类型是16位的,而int类型是32位的,在进行x + 1运算时,将x隐式转换为32位,然后得到的结果就是32位的,而此时将结果赋值给左边的x,则会报错,因为会丢失16位的精度。

      而#2的代码则不会出现这样的问题,因为 不管是在C#还是在Java中E1 op= E2; 等价于E1 = (T)((E1) + (E2)); 其中T是E1的数据类型,op为操作符,op= 为复合运算符;

      但我并没有说x += 1;就是比x = x + 1;好之类的话,因为有时复合运算符是有“陷阱”(我说的是陷阱不是缺陷)的!请看下面的代码:

    View Code
    int x = int.MaxValue;
    x += 1;
    Console.WriteLine(x);

      其实你也知道,上面代码的结果不会是一个正数。

      @2:x = x + 1; & x += 1; & x ++; 效率的比较

      这一部分参考了这里:http://www.nowamagic.net/librarys/veda/detail/616  还有这里:http://stackoverflow.com/questions/808062/x-x1-vs-x-1

      主要还是参考了前面这个,因为感觉StackOverflow中主要考虑的是编译器的因素,而前一个考虑的是每条语句本身的执行细节和过程:

      

      #1:x = x + 1; 的执行效率最低,因为它的执行过程如下:

    1. 读取右边变量 x 的内存地址;
    2. 执行 x+1;
    3. 读取左边变量 x 的内存地址;
    4. 将右边的值传给左边的变量 x(编译器并不认为左右两边的变量 x 的内存地址相同)。

      首先寻找右面x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着寻找左面x的地址(计算机是不知道左面的x就是右面的x的),再讲刚计算的结果存到左面的x的地址中。

      #2: x +=1 其次,它的执行过程如下:

    1. 读取右边变量 x 的内存地址;
    2. 执行 x+1;
    3. 将得到的值传给变量 x (因为变量 x 的内存地址已经读出)。

      寻找x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着将计算结果存到x的地址中(这里计算机知道读与写两个操作的地址是相同的)。

      #3: x++ 执行效率最高,它的执行如下:

    1. 读取右边变量 x 的内存地址;
    2. 变量 x 自增1。

      寻找x的地址,然后读取地址中x的值,然后直接将地址中的值加1。

      从上面的过程可以看出,x++比x+=1少了一个写的过程,而x+=1比x=x+1少了一个寻址的过程(查找左面x的地址),所以三条语句的效率是x = x + 1 < x += 1 < x++ 。

  • 相关阅读:
    大宗商品经营管理特点与风险节点
    大宗商品企业风险管理与套期会计课程
    推荐一个php7+ mongodb三方类
    利用Redis锁解决高并发问题
    PHP socket初探 --- 关于IO的一些枯燥理论
    Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化
    PHP利用Mysql锁解决高并发
    PHP AES cbc模式 pkcs7 128加密解密
    PHP 利用文件锁处理高并发
    Redis 应用场景【商品拼团抢购】
  • 原文地址:https://www.cnblogs.com/lxw0109/p/x_increment_op.html
Copyright © 2020-2023  润新知