zoukankan      html  css  js  c++  java
  • tips: a=a+b 与 a+=b

    前言:

      我们在编码的时候, 经常会使用到 a 加上一个数或者加上一个字符串, 然后再赋值回给 a . 那么 a=a+b 和 a+=b是相同的么?

    情景1:

    a, b 类型相同, 且都为值类型

    @Test
    public void demo1() {
        int a = 10;
        int b = 11;
        a = a + b;
        System.out.println("a = a + b : " + a);
    
        a = 10;
        a += b;
        System.out.println("a += b : " + a);
    }

    情景2: 

    a,b 类型相同, 且都为引用类型:

    @Test
    public void demo2() {
        String a = "a";
        String b = "b";
        a = a + b;
        System.out.println("a = a + b : " + a);
    
        a = "a";
        a += b;
        System.out.println("a += b : " + a);
    }

    情景3: 

    a, b类型不同, 一个为值类型, 一个为字符串类型

    @Test
    public void demo3() {
        String a = "a";
        int b = 10;
        a = a + b;
        System.out.println("a = a + b : " + a);
    
        a = "a";
        a += b;
        System.out.println("a += b : " + a);
    }

    从上面看, 好像能得出结论, 没啥区别啊, 是把? 

    如果真是这样, 那么我试试 a,b都是值类型, 但是有效范围不同, 或者说长度不同. 看看是不是也是这样呢.

    情景4: 

    a, b都是值类型,但是a长度小, b长度长

    @Test
    public void demo4() {
        int a = 10;
        long b = 10L;
        a = a + b;
        System.out.println("a = a + b : " + a);
    
        a = 10;
        a += b;
        System.out.println("a += b : " + a);
    }

    在编写的时候, 从编译器上, 已经能看到不同了.

    尽管如此, 我还是运行一下看看.

    报精度丢失错误, 因为 等号 要求两边的类型一致, 很明显, int + long , int 自动转为高精度数据long, 相当于 int = long + long , 这时候, 发现等号两边数据类型不一致啊, 怎么赋值啊.

    这里其实就相当于写了 : int c = 10L;

    看一下编译器怎么提示:

    我们都知道 int -> long , 没有问题, 因为不会产生值失真. 但是如果把 long -> int , 是有可能产生 失真 的. 那电脑不能决定是否要给你截值, 除非我们手动告诉电脑, 我们就要这么玩.

    int c = (int)10L;

    我将a=a+b注释掉, 看看 a+=b行不行

    运行成功了. 为啥 += 能成功呢?

    从结果上看, += 肯定为我们做了类型转换, 否则也不会成功的. 最后给到精度小的值, 当然有溢出风险是肯定的. 

  • 相关阅读:
    封装异常处理之坑
    30multipart/form-data和application/x-www-form-urlencoded的区别(二)urlencoded之自动deocde
    使用MAT时的Shallow Size和 Retained Size的区别
    当动态代理遇到ioc
    线程池的原理
    synchroned原理与对象头(yet)
    mysql压力测试与qps监控
    一种mysql jvm死锁
    Android Jni变量对照表
    结构体中使用函数指针
  • 原文地址:https://www.cnblogs.com/elvinle/p/8144946.html
Copyright © 2011-2022 走看看